Rails:为什么activerecord find和find_by_attribute的表现不一样?

时间:2015-12-01 06:03:29

标签: ruby-on-rails activerecord

我喜欢activerecords multiple find

Country.find(1, 2) # Returns an array of countries

我喜欢自动find_by_attribute生成:

Country.find_by_iso2('US') # Equivalent to Country.where(iso2: 'US').first

那么为什么这个组合不起作用/存在?

Country.find_by_iso2('US', 'CA') 
# Would expect an array, it fails because too many arguments

Country.find_by_iso2(['US', 'CA']) 
# Would expect an array, returns only the last one (Canada)

相反,我不得不写:

['US', 'CA'].map{ |e| Country.find_by_iso2(e) }

更不优雅。

2 个答案:

答案 0 :(得分:0)

Model.find_by(*args)

查找与指定条件匹配的第一条记录。没有隐含的订单,所以如果订单很重要,您应该自己指定。

如果未找到记录,则返回nil

Post.find_by name: 'Spartacus', rating: 4
Post.find_by "published_at < ?", 2.weeks.ago

docs:http://apidock.com/rails/v4.0.2/ActiveRecord/FinderMethods/find_by

答案 1 :(得分:0)

文件activerecord / lib / active_record / relation / finder_methods.rb,第47行

def find_by(*args)
  where(*args).take
end

因为它接受一个参数作为数组并只返回它的第一个元素