Пожалуйста, посмотрите на эту базовую настройку ассоциаций (Rails 4.2.1):
class Parent < ActiveRecord::Base
has_many :kids
end
class Kid < ActiveRecord::Base
belongs_to :school
end
class School < ActiveRecord::Base
end
С этими моделями следующий код работает как положено и сохраняет связь loaded
:
parent = Parent.first
parent.kids.to_a
parent.association(:kids).loaded? # => true
Но : добавление .includes(:school)
предотвращает загрузку / кэширование ассоциации по некоторым причинам
parent = Parent.first
parent.kids.includes(:school).to_a
parent.association(:kids).loaded? # => false
Просматривая журналы SQL, я вижу точно такой же запрос выбора, поэтому ожидаю, что ассоциация будет загружена / кэширована.
Вопрос
Почему это происходит?
ActiveRecord предварительно загружает / кэширует parent.kids
в первом примере. Я хочу понять, почему это невозможно во втором примере с includes
call?
Идеальный ответ для меня - ссылки на источники.
Спасибо за любую помощь
приписка
Обходное решение, которое я использую, устанавливает association.target
вручную:
parent.association(:kids).target = parent.kids.includes(:school).to_a