使用ActiveRecord 3 / Arel查找单个记录的最佳方法?

时间:2011-06-13 03:38:21

标签: ruby-on-rails ruby activerecord arel

我曾经这样做过:

Foo.find_by_bar('a-value')

我现在可以这样做:

Foo.where(:bar => 'a-value').limit(1).first

这是推荐的吗?这是最好的方法吗?我应该继续使用“旧的”方式,因为它仍然是有用的语法糖,或者现在我能做到的更好的方式,这将支持链接和所有其他好东西?

5 个答案:

答案 0 :(得分:44)

Rails 4:

Foo.find_by bar: 'a_value' , wibble: 'a wibble value'

答案 1 :(得分:23)

我认为返回单个记录的首选方法与第二个示例相同,但您可以省略限制部分:

Foo.where(:bar => 'a-value').first

如果要为查找添加更多条件,这将遵循新语法并支持链接。

答案 2 :(得分:4)

Rails为您提供了大量神奇的方法:

Foo.find_by_bar('a-value')

您还可以使用多个属性:

Foo.find_by_bar_and_wibble('a foo value', 'a wibble value')

并附加一个!如果找不到任何内容,会导致它抛出RecordNotFound:

Foo.find_by_bar!('a-value')

答案 3 :(得分:2)

其他选择:

Foo.find(:first, conditions: { bar: 'a-value' })

您还可以使用多个属性:

Foo.find(:first, conditions: { bar: 'a-value' , wibble: 'a wibble value' })

答案 4 :(得分:1)

如果您只需要一个记录(我来这里是为了寻找),Rails 6.1 为此引入了 find_sole_by(或 where(...).sole)。

行为如下:

<块引用>

查找唯一匹配的记录。如果未找到记录,则引发 ActiveRecord::RecordNotFound。如果找到多条记录,则引发 ActiveRecord::SoleRecordExceeded

用例很简单:

Foo.find_sole_by(bar: 'a-value')

适用于需要单个记录的场合。