Ruby on rails Rails:为什么activerecord查找和查找属性don';你的行为不一样吗?

Ruby on rails Rails:为什么activerecord查找和查找属性don';你的行为不一样吗?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我喜欢activerecords多个查找: Country.find(1, 2) # Returns an array of countries 我喜欢自动按属性查找\u生成: Country.find_by_iso2('US') # Equivalent to Country.where(iso2: 'US').first 那么,为什么组合不起作用/不存在 Country.find_by_iso2('US', 'CA') # Would expect an array, it fails

我喜欢activerecords多个
查找

Country.find(1, 2) # Returns an array of countries
我喜欢自动
按属性查找\u
生成:

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) }
它不那么优雅。

模型。通过(*args)查找

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

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

Post.find_by name: 'Spartacus', rating: 4
Post.find_by "published_at < ?", 2.weeks.ago
Post.find_按名称:“斯巴达克斯”,评级:4
2周前,通过“发布于<?”发布.find_
文档:

模型。通过(*args)查找

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

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

Post.find_by name: 'Spartacus', rating: 4
Post.find_by "published_at < ?", 2.weeks.ago
Post.find_按名称:“斯巴达克斯”,评级:4
2周前,通过“发布于<?”发布.find_

文档:

文件activerecord/lib/active\u record/relation/finder\u methods.rb,第47行

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

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

文件activerecord/lib/active\u record/relation/finder\u methods.rb,第47行

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

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

,谢谢回复。要么我不明白你的答案,要么它真的不明白为什么这两个方法(
find
find\u by\u attribute
)的行为方式不同……谢谢你的回答。要么我不明白你的答案,要么它真的不明白为什么这两个方法(
find
find\u by\u attribute
)的行为方式不同……谢谢你的回答。要么我不明白你的答案,要么它真的不明白为什么这两个方法(
find
find\u by_属性
)没有以相同的方式构建……
find\u by
将获取满足你参数的第一个项,因此如果我这样做,例如使用:
Post.find\u by(名称:“Richard”,评级:10000)
它将返回它找到的第一个满足上述条件的项目。而
Post.find(名称:“Richard”,评级:10000)
将返回表中满足这些列值的所有项目。感谢您的回复。要么我不理解您的答案,要么它不理解这两种方法(
find
find\u by\u attribute
)的原因我们的行为方式不同,
find_by
将获取满足您参数的第一项,因此如果我这样做,例如,使用以下方式进行查询:
Post.find_by(name:'Richard',rating:10000)
它将返回它找到的满足上述条件的第一项。而
Post.find(名称:“Richard”,评级:10000)
将返回表中满足这些列值的所有项。