如果记录过多,如何获取活动记录以引发异常

时间:2019-04-18 14:44:31

标签: ruby-on-rails activerecord

遵循fail-fast的原则:

查询数据库中应该只有一条记录的地方时,如果.first()first)遇到多条记录,我想例外。

我发现,如果记录少于预期,就会抛出一个first!方法,但是如果有两个或更多记录,我什么也看不到。

如果记录多于预期,如何使活动记录过早失效?

是否有活动记录无法通过这种方式工作的原因?

我已经习惯了C#的Single(),如果找到两个记录,它将抛出该错误。

3 个答案:

答案 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::Relationcountone?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