遵循fail-fast的原则:
查询数据库中应该只有一条记录的地方时,如果.first()
(first)遇到多条记录,我想例外。
我发现,如果记录少于预期,就会抛出一个first!方法,但是如果有两个或更多记录,我什么也看不到。
如果记录多于预期,如何使活动记录过早失效?
是否有活动记录无法通过这种方式工作的原因?
我已经习惯了C#的Single(),如果找到两个记录,它将抛出该错误。
答案 0 :(得分:2)
似乎ActiveRecord没有类似的方法。我发现一种有用的方法是one?,您可以在ActiveRecord::Relation
对象上调用它。你可以做
users = User.where(name: "foo")
raise StandardError unless users.one?
,也许定义自己的自定义异常
答案 1 :(得分:2)
如果记录多于1条,为什么您会期望activerecord的first
方法失败?这样工作是没有意义的。
您可以定义自己的类方法,在获取第一个记录之前对记录进行计数。像
def self.first_and_only!
raise "more than 1" if size > 1
first!
end
如果存在多个记录,并且根本没有记录,则会引发错误。如果只有一个,它将返回它。
答案 2 :(得分:1)
如果您足够关心查询性能,则必须避免使用ActiveRecord::Relation
,count
,one?
,none?
,many?
,{{1} }等,会产生SQL any?
查询。
因此,您可以使用SQL select count(*) ...
,例如:
limit
此外,当您希望仅获得一条记录时,必须使用Relation的def self.single!
# Only one fast DB query
result = limit(2).to_a
# Array#many? not ActiveRecord::Calculations one
raise TooManySomthError if result.many?
# Array#first not ActiveRecord::FinderMethods one
result.first
end
而不是take
。最后一个用于真正的 first 记录,并且可以产生无用的SQL first
。