对于某些人来说,这个问题可能很奇怪。通过查看语法可识别为类方法。
Model.find_by_*
因此,如果它的类方法应该在我们创建的模型中定义,或者在
中定义ActiveRecord::Base
所以我的问题是rails如何设法添加这些方法并使我们可用。
例如
Model.find_by_id
Model.find_by_name
Model.find_by_status
等等。
答案 0 :(得分:2)
您需要查看ActiveRecord::FinderMethods
。 Here您可以找到更多详细信息。
在内部,它会根据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