ここで何かが足りない可能性がありますが、これはパフォーマンスの見落としのようです。Errbitのクエリログを見て、同じオブジェクトに対する何百ものクエリに気付いたとき、私は最初にこれに気づきました。
リレーションのすべての子は、has_many
リレーションを介してロードされた後、親オブジェクトへの参照を持っていないようです。つまり、アクセスすると、メモリ内のコピーで設定されるのではなくparent.children.map &:parent
、DBから親が1回ずつ取得されます。child
parent
例:
非常にシンプルなbelongs_to
/has_many
セットアップの使用:
class Person
include Mongoid::Document
field :name
has_many :posts, :inverse_of => :person
end
class Post
include Mongoid::Document
field :text
belongs_to :person, :inverse_of => :posts
end
次に、Railsコンソールで、簡単なデモンストレーションを行います。
Loading development environment (Rails 3.2.12)
[1] pry(main)> tom = Person.create(:name => 'Tom')
[2] pry(main)> tom.posts.create(:text => 'stuff')
[3] pry(main)> tom.posts.create(:text => 'other stuff')
[4] pry(main)> Person.first.posts.map {|post| post.person.object_id}
=> [50687740, 50719060]
最後の行では、各person
参照が異なるrubyオブジェクトを指していることに注意してください。私はrubyのobject_id
属性を使用して、これらが文字通り異なるオブジェクトであり、データベースへの2回のラウンドトリップが必要であるという事実を強調しています。
has_manyリレーションを介してロードした後、親リレーションが親オブジェクトへの単なる参照ではないのはなぜですか?