使用 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
Rails:将复杂的 SQL 查询转换为 Arel 或 ActiveRecord