快速简单示例,
拥有这样的用户表,
id : integer
name : varchar(255)
并且有一些种子
1,john doe
2,约翰史密斯
...
如果我想获得带有id的第二行。
推荐的方式是什么?
我知道有很多rails代码约定
User.find(2)
User.find_by(:id => 2)
User.find_by_id(2)
User.where(:id => 2)
以及更多......
最佳推荐方式是什么?
我们的团队正在使用所有代码约定。
我想只选择一个并整合这些代码。
答案 0 :(得分:2)
您需要单个模型或nil:
User.find_by_id(2)
您需要单个模型或零,您可能稍后查询:
User.find_by(:id => 2)
User.find_by(:id => 2, :email => 'user@email.com')
您需要单个模型或例外,稍后可能会查询更多:
User.find_by!(:id => 2)
User.find_by!(:id => 2, :email => 'user@email.com')
您需要单个模型或例外:
User.find(2)
User.find_by_id!(2)
一个是短的,一个是明确的。你的选择。
您需要ActiveRecord Relation(多个模型)和链式方法:
User.where(:name => 'Yoda').order('created_on DESC').find(2)
如果有很多Yodas潜伏着。
来源:
http://guides.rubyonrails.org/active_record_querying.html#dynamic-finders
http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find
http://edgeguides.rubyonrails.org/4_0_release_notes.html#active-record
答案 1 :(得分:0)
如果 id 是主键,最好的方法是
User.find(id)
如果 id 不是主要的,我建议您使用
User.find_by_id(id)
永远记住,查找会返回单个记录,而其中会将所有匹配的记录作为数组返回。
答案 2 :(得分:0)
完全取决于用例,
唯一需要注意的是:
User.find(id)
如果找不到记录,会引发Exception
,而
User.find_by(id: 1)
只会返回nil,如果您在应用程序中处理nil
,那么您无需担心它。
根据弃用看here。
而且find()并不期望number
,所期望的是你传递的值必须将其第0个字符作为数字,所以
User.find("1-this-works")
也会奏效。
答案 3 :(得分:0)
Ben的回答很明显 - 这些不是惯例,它们是功能上不同的方法。
然而,其中一些表达式在功能上是相同的 - Ruby旨在允许表达同一事物的不同方式 - 这是因为Ruby是一种面向人的语言(Ruby philosophy),这意味着它&#39 ; s的创造者采用了一种人类语言观点,即当正确使用时,同义词通过激发有用的关联来增强我们理解语言的能力,并且在未正确使用时不会真正受到伤害(这个想法通常归因于Perl的创建者 - Larry墙 - 见There Is More Than One Way To Do It原则。)
底线是 - 这是Ruby语言的基本设计原则之一 - 通常一个好主意是接受你最近采用的语言哲学,而不是强迫以前习惯的语言语言到新的