如何在rails中使用find_by_ *

时间:2017-03-17 10:37:05

标签: ruby-on-rails ruby-on-rails-4

对于某些人来说,这个问题可能很奇怪。通过查看语法可识别为类方法

Model.find_by_*

因此,如果它的类方法应该在我们创建的模型中定义,或者在

中定义
ActiveRecord::Base

所以我的问题是rails如何设法添加这些方法并使我们可用。

例如

 Model.find_by_id
 Model.find_by_name
 Model.find_by_status

等等。

2 个答案:

答案 0 :(得分:2)

您需要查看ActiveRecord::FinderMethodsHere您可以找到更多详细信息。

在内部,它会根据WHERE中的属性触发find_by_attributes查询。它返回第一个匹配的对象。

def find_by_attributes(match, attributes, *args)
  conditions = Hash[attributes.map {|a| [a, args[attributes.index(a)]]}]
  result = where(conditions).send(match.finder)

  if match.bang? && result.nil?
    raise RecordNotFound, "Couldn't find #{@klass.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"
  else
    yield(result) if block_given?
    result
  end
end

还有find_all_by_attributes可返回所有匹配的记录。

答案 1 :(得分:1)

Rails正在使用ruby元编程method_missing。方法find_by_name不在模型中,而是将此name作为第一个参数,并将其称为find_by(name: ?),即调用where(name: ?).take