模拟非关联表的预先加载

时间:2011-11-17 15:49:07

标签: ruby-on-rails ruby activerecord

我有一个quality_code字段,该字段是用户输入的自由文本。但是,某些已知的代码具有更长的描述。如果已知代码存储在记录中,我想显示描述代替代码。

我在模型上有一个简单的方法来显示描述(如果可用),或输入的quality_code(如果没有),但它属于绘制n个项目列表所需的n + 1个查询的典型模式:

def view_quality_code
  if (code = QualityCode.find_by_quality_code(quality_code)).nil?
    quality_code
  else
    code.description
  end
end

如果模型实际上是链接的(belongs_to :quality_code),那么我会通过向查询添加includes(:quality_code)来对此进行排序,因此它只会对quality_code表执行一次额外的查询。

在没有链接模型的情况下,是否有一种简单的方法可以做同样的事情?

1 个答案:

答案 0 :(得分:1)

不知道你的其他型号叫什么,我会假装它是“小工具”。假设你有一组像这样的小部件:

widgets = Widget.all

你可以像这样伪装自己的热心:

@codes = QualityCode.where(:quality_code => widgets.map(&:quality_code).uniq).group_by(&:quality_code) 

def view_quality_code
  if codes = @codes[quality_code]
    codes[0].description
  else
    quality_code
  end
end