次のモデルがあるとします。
class Post < ActiveRecord::Base
has_many :authors
class Author < ActiveRecord::Base
belongs_to :post
そして、Author
モデルに属性があるとしますname
。
特定の著者「alice」を含むすべての投稿を、その著者の名前で検索したいと思います。アリスと投稿を共同執筆した別の著者「bob」がいるとします。
includes
とを使用して最初の結果を検索する場合where
:
post = Post.includes(:authors).where("authors.name" => "alice").first
実際にはもっと多くの著者がいる場合でも、投稿には現在1人の著者しかいないことがわかります。
post.authors #=> [#<Author id: 1, name: "alice", ...>]
post.reload
post.authors #=> [#<Author id: 1, name: "alice", ...>, #<Author id: 2, name: "bob", ...>]
includes
問題はとの組み合わせにあるようですwhere
。これにより、スコープが目的の投稿に正しく制限されますが、同時に、一致するものを除くすべての関連付けが非表示になります。
最終的にはチェーン用になりたいActiveRecord::Relation
ので、上記のリロードソリューションは実際には満足のいくものではありません。で置き換えるとこれは解決includes
されjoins
ますが、関連付けを熱心にロードすることはありません。
Post.joins(:authors).where("authors.name" => "alice").first.authors
#=> [#<Author id: 1, name: "alice", ...>, #<Author id: 2, name: "bob", ...>]
Post.joins(:authors).where("authors.name" => "alice").first.authors.loaded?
#=> false
助言がありますか?事前のおかげで、私はしばらくの間この問題に頭を悩ませてきました。