假设我有以下模型:
class Post < ActiveRecord::Base
has_many :authors
class Author < ActiveRecord::Base
belongs_to :post
假设Author
模型有一个属性,name
。
我想以该作者的名字搜索给定作者“爱丽丝”的所有帖子。假设有另一位作者“鲍勃”与爱丽丝合着了一篇文章。
includes
如果我使用and搜索第一个结果where
:
post = Post.includes(:authors).where("authors.name" => "alice").first
您会看到该帖子现在只有一位作者,即使实际上还有更多:
post.authors #=> [#<Author id: 1, name: "alice", ...>]
post.reload
post.authors #=> [#<Author id: 1, name: "alice", ...>, #<Author id: 2, name: "bob", ...>]
问题似乎是 and 的组合includes
,where
它将范围正确地限制为所需的帖子,但同时隐藏了除匹配的关联之外的所有关联。
我想最终得到一个ActiveRecord::Relation
for 链接,所以上面的重新加载解决方案并不令人满意。替换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
有什么建议么?在此先感谢,我一直在努力解决这个问题一段时间。