2016-03-29 9 views
0

モデルから呼び出されたときに、関連するデータとともに特定のテーブルのすべてのレコードを取得しようとしています。私はさまざまなオプションを試しましたが、それを理解することはできません。レールにすべての関連するデータが含まれています

私はAAレールの構造を有する: (すべてのクラスがActiveRecordの継承されていると仮定します。ベースを)

class Post 
    has_many :image 
    has many :comment 
end 

class Image 
    belongs_to :post 
end 

class Comment 
    belongs_to :post 
end 

基本的に私は私のPostクラス(またはモデル)に、関連するすべてのデータを持つすべての記事を取得したいが。たとえば:

Post.all (but then here do something to include each post's images and comments) 

私はこれらの2つのオプションが試してみたが、彼らは関連するデータを返すいけない

Post.all.eager_load(:image, :comment) 
Blog2.all.includes(:image, :comment) 

私のコントローラでは、私は、インデックスメソッド

def index 
    @posts = Post.all 
    render json: @posts, :include => [:image, :comment] 
    end 

このインデックスメソッドの作品を​​持っています完全に、各レコードに関連するデータが含まれていますが、モデル内の関連するデータですべての投稿を取得しようとすると、私はうまく動作しません。助けてくれてありがとう

+0

あなたは 'Post.joins([:画像:コメント])試してみました。ALL'? 'rails console'で' 'Post.joins([:image、:comment])。to_sql'を実行し、' sql'が生成されていることを確認することができます。 – Dharam

+1

そして、関連付けをjsonにエクスポートするには、 'render json:@ posts.to_json(:include => [:image、:comment))'を使う必要があります。 – Dharam

答えて

1

もうすぐです。 includesメソッドは、関連付けられたデータを事前にロードしますが、具体的に指示しないかぎり、実際に結果を表示することはありません。例えば

blog_records = Blog2.all.includes(:image, :comment) 
blog_records_with_associations = blog_records.map do |record| 
    record.attributes.merge(
    'image' => record.image, 
    'comment' => record.comment 
) 
end 

これはJSONとして公開するための適切なハッシュのアレイにデータを変換します。

あなただけのRubyで関連レコードにアクセスする必要がある場合、それは簡単です:

blog_records = Blog2.all.include(:image, :comment) 
first_image = blog_records.image  # preloaded, no SQL fired 
first_comment = blog_records.comment # preloaded, no SQL fired 
+0

ちょうどそれを指摘するために、答えは、応答がコントローラから直接jsonとしてレンダリングされるこの特定の場合にのみ適用されます。 – mmhan

+0

@ mmhan ok編集しました。あなたが追加するものは何ですか? –