Rails“find_all_by”vs“.where”

时间:2012-06-27 18:42:50

标签: ruby-on-rails where dynamic-finders

我有以下代码:

def maturities
  InfoItem.find_all_by_work_order(self.work_order).map(&:maturity)
end

我正在考虑将其更改为:

def maturities
  InfoItem.where(work_order: self.work_order).map(&:maturity)
end

这有什么好处吗?现在似乎.wherefind_all_by更常见。

2 个答案:

答案 0 :(得分:25)

我的观点是使用.where是一种更好的方法。

当您使用基于属性的查找程序时,您将不得不通过方法缺少调用进行隧道传输,并最终通过class_eval定义一个返回结果的类方法。这是您可能不需要执行的额外处理。

另外,串联起来:find_by_this_and_this_and_this_and_this ......可能会变得难看。

See how rails accomplishes attribute based finders here

github上的模块DynamicMatchers 缺少方法:

def method_missing(name, *arguments, &block)
  match = Method.match(self, name)

  if match && match.valid?
    match.define
    send(name, *arguments, &block)
  else
    super
  end
end

答案 1 :(得分:2)

我认为主要的优点是能够在其中添加额外的标准,find_all_by仅限于动态选择器的字段。如果你只有一个条件你正在搜索那么我认为这是一个洗,但当你开始添加3或4时,动态查找器可能是丑陋的。散列很好看,如果需要,你可以将条件的散列作为参数传递。动态查找器很酷,但我认为哪种比例更清晰,更易读。