我有代码
class Magazine < ActiveRecord::Base
has_many :ads
end
class Ad < ActiveRecord::Base
belongs_to :magazine
end
我的代码中有以下内容(给定params[:magazine_name]
,params[:ad_name]
):
mag = Magazine.find_by_name(params[:magazine_name])
@ad = mag.ads.find_by_name(params[:ad_name])
如果我现在访问@ad.magazine
,它会通过杂志ID查找另一个数据库查询,该查询存储在@ad
中。为什么ActiveRecord没有足够聪明地意识到它已经从数据库中得到了它并且不应该再次获得它? (我怎样才能让它变得更聪明?)
答案 0 :(得分:2)
它不够智能的原因是因为默认情况下ActiveRecord不使用身份映射模式。传闻解决方案是using :inverse_of
on your relationships。
答案 1 :(得分:0)
你想做一些叫做“渴望加载”的事情,你可以在那里加载你知道你很快就会需要的关联。 Rails 2和Rails 3之间的方法不同。
在rails 3中,您使用.includes方法:
Ad.includes(:magazine).find_by_name(params[:ad_name])
在rails 2中,您使用:include hash:
Ad.find_by_name(params[:ad_name], :include => [:magazine])