我曾经这样做过:
Foo.find_by_bar('a-value')
我现在可以这样做:
Foo.where(:bar => 'a-value').limit(1).first
这是推荐的吗?这是最好的方法吗?我应该继续使用“旧的”方式,因为它仍然是有用的语法糖,或者现在我能做到的更好的方式,这将支持链接和所有其他好东西?
答案 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')
适用于需要单个记录的场合。