has_many / belongs_to关联导致双重查询

时间:2011-04-04 14:14:11

标签: ruby-on-rails activerecord associations

我有代码

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没有足够聪明地意识到它已经从数据库中得到了它并且不应该再次获得它? (我怎样才能让它变得更聪明?)

2 个答案:

答案 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])