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

Posted

技术标签:

【中文标题】使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?【英文标题】:Best way to find a single record using ActiveRecord 3 / Arel? 【发布时间】:2011-09-13 15:54:12 【问题描述】:

我曾经这样做的地方:

Foo.find_by_bar('a-value')

我现在可以这样做了:

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

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

【问题讨论】:

我其实很喜欢旧的 find_by_*。意图很明确,如果你只需要这些,语法就更简单了。 它在 Rails 3 中仍然完全有效。如果使用 Rails 4,您可以使用find_by(bar: 'a-value') 我来这里是为了只是一条记录。如果其他人也有同样的想法,我已经给出了这个场景的答案down here :) 【参考方案1】:

导轨 4:

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

【讨论】:

您可以为此添加来源吗? 知道为什么 RubyMine 会警告不应从视图助手调用此方法吗? find_by 是一种繁重的操作,建议不要在渲染视图时触发【参考方案2】:

我认为返回单个记录的更可取的方法是按照您的第二个示例的思路,但您可以省略限制部分:

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

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

【讨论】:

如果您想确保找到记录,请使用Foo.where(:bar => 'a-value').first!。这样ActiveRecord::RecordNotFound 将被提出,否则。【参考方案3】:

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')

【讨论】:

这些动态查找器自 rails 4.0 (edgeguides.rubyonrails.org/…) 起已弃用,因此现在学习可能不是一个好习惯。【参考方案4】:

其他选择:

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

你也可以使用多个属性:

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

【讨论】:

【参考方案5】:

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

行为如下:

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

用例很简单:

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

适用于那些必须记录单一记录的场合。

【讨论】:

以上是关于使用 ActiveRecord 3 / Arel 查找单个记录的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

Rails/Arel:选择所有记录作为 ActiveRecord::Relation

使用 Arel 进行嵌套集和连接查询并转换为 ActiveRecord::Relation

ActiveRecord Arel OR 条件

Rails:将复杂的 SQL 查询转换为 Arel 或 ActiveRecord

Rails ActiveRecord Arels:不支持的参数类型:字符串。改为构造一个 Arel 节点

Arel + Rails 4.2 导致问题(绑定丢失)