-1

RoR 3.2.13 の熱心な読み込み部分をよりよく理解できるように、プロジェクトをこれに単純化しました。これらは私のクラスです:

class Person < ActiveRecord::Base
  attr_accessible :name
  has_many :posts
end

class Post < ActiveRecord::Base
  attr_accessible :name, :person_id
  belongs_to :person
end

私が何かをするとき

people_data = Person.includes(:posts)

IRB は次の SQL を示しています。

Person Load (1.3ms)  SELECT `people`.* FROM `people` 
Post Load (0.7ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`person_id` IN (1, 2)

結果のオブジェクトは次のようになります。

=> [#<Person id: 1, name: "Ernie">, #<Person id: 2, name: "Bert">] 

人物オブジェクトが 2 つしかなく、投稿がないことに注意してください。人物とその投稿で単純なデータ構造を取得するにはどうすればよいですか。これを単一の命令で実行したいのですが、ピープル配列で foreach を実行したくありません。

私はこのようなものを期待しています:

[#<Person id: 1, name: "Ernie">, [#<Array 0 => #<Post id:1, name: "Hi">, 1 => #<Post id:2, name: "Hello"> > ....
4

3 に答える 3

3

熱心な読み込み が機能しています。すべての投稿を熱心に (1 つのクエリで) 取得しています。Eager ローディングは、すべての投稿と人物を含む配列を構築しません。

# With eager loading
people_data = Person.includes(:posts) # 2 queries: 1 for persons, 1 for posts
people_data.first.posts.each do |post|
  # No queries
end

# Without eager loading
people_data = Person.all # 1 query for persons
people_data.first.posts.each do |post|
  # Query for each post
end

people_dataどちらの場合も、(似たような)ActiveRecord::Relationオブジェクトが含まれることに注意してください。(これは配列ではありません!) 関連付けられたレコードの使用を開始したときにのみ、熱心な読み込みの利点が見られます。

すべての人物と投稿を含む配列を構築したいという特別な理由がない限り、意図されたように熱心な読み込みを使用する必要があります。これは、独自の配列を構築しようとするよりも効率的です。

于 2013-08-29T05:01:23.700 に答える