Предположим, у меня есть следующие модели:
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
Вы увидите, что у поста сейчас только один автор, хотя на самом деле их больше:
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
Какие-либо предложения? Заранее спасибо, давно ломал голову над этой проблемой.