У меня есть следующие три модели (упрощенно):
class A < ActiveRecord::Base
has_many :bs
has_many :cs, :through => :bs
end
class B < ActiveRecord::Base
belongs_to :a
has_many :cs
end
class C < ActiveRecord::Base
belongs_to :b
end
Кажется, что A.cs получает кешированный первый раз, когда он используется (для каждого объекта), когда я действительно этого не хочу.
Здесь консольный сеанс, который подчеркивает проблему (пух был отредактирован)
Во-первых, как он должен работать
rails console
001 > b = B.create
002 > c = C.new
003 > c.b = b
004 > c.save
005 > a = A.create
006 > a.bs << b
007 > a.cs
=> [#<C id: 1, b_id: 1>]
Это действительно так, как вы ожидали. A.cs идет хорошо через отношение a.bs.
И теперь для кеширующих ярости
008 > a2 = A.create
009 > a2.cs
=> []
010 > a2.bs << b
011 > a2.cs
=> []
Итак, первый вызов a2.cs(приводящий к запросу db) вполне корректно возвращает Cs. Второй вызов, однако, показывает отчетливый недостаток Cs, хотя они должны быть хорошими (там не было запросов db).
И просто проверить мое здравомыслие не виноват
012 > A.find(a2.id).cs
=> [#<C id: 1, b_id: 1>]
Опять же, был выполнен запрос db, чтобы получить как запись A, так и связанные с ней.
Итак, вернемся к вопросу: как заставить рельсы не использовать кешированный результат? Я мог бы смириться с этим решением (как показано на шаге 12), но поскольку это приведет к дополнительным двум запросам, когда требуется только один, я бы предпочел не делать этого.