Предположим, у меня есть следующие модели:
class Post < ActiveRecord::Base
has_many :authors
class Author < ActiveRecord::Base
belongs_to :post
И предположим, что модель Author
имеет атрибут, name
.
Я хочу найти все сообщения с заданнымАвтор "Алиса", по имени этого автора.Скажем, есть другой автор "Боб", который является соавтором сообщения с Алисой.
Если я ищу первый результат, используя includes
и where
:
post = Post.includes(:authors).where("authors.name" => "alice").first
You 'Вы увидите, что у поста теперь только один автор, даже если на самом деле их больше:
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
Есть предложения?Заранее спасибо, я некоторое время ломал голову над этой проблемой.