Rails 4查询代码约定

时间:2014-12-09 06:09:30

标签: ruby-on-rails

快速简单示例,

拥有这样的用户表,

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)

以及更多......

最佳推荐方式是什么?

我们的团队正在使用所有代码约定。

我想只选择一个并整合这些代码。

4 个答案:

答案 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语言的基本设计原则之一 - 通常一个好主意是接受你最近采用的语言哲学,而不是强迫以前习惯的语言语言到新的