3

Active Record 中有什么东西可以确保您的查询不会返回多条记录吗?

这就是基本功能(抱歉——这不是真正的代码,但足以说明我在寻找什么):

Foo.where(:thing => 'this_should_be_uniq').single

def single(records)
  if records.length > 1
    raise # or maybe return nil or something like that
  else
    return records.first
  end
end

从本质上讲,这可以防止意外假设(错误地)您的查询将始终返回一条记录。

谢谢!

4

4 回答 4

0

如果我正确理解您的问题,您可以使用limit

Foo.where(:thing => 'this_should_be_uniq').limit(1)
于 2013-09-30T15:20:09.677 回答
0

你可以做 Foo.where(:thing => 'this_should_be_uniq').single 或 Foo.where(:thing => 'this_should_be_uniq').single 或.limit(1)

Foo.where(:thing => 'this_should_be_uniq').first
Foo.where(:thing => 'this_should_be_uniq').last
Foo.where(:thing => 'this_should_be_uniq').limit(1)
于 2013-09-30T15:20:21.267 回答
0

我在 ActiveRecord::FinderMethods 中找不到这样的方法。

tap作为替代解决方案,如果存在两个以上的记录,则可以在引发异常的情况下使用方法将其编写得更短:

Foo.where(:thing => 'this_should_be_uniq').tap { |r| raise "ERROR" if r.count > 1 }.first

考虑到与其他操作的隔离,下面的代码是合适的:

Foo.where(:thing => 'this_should_be_uniq').to_a.tap { |r| raise "ERROR" if r.size > 1 }[0]

于 2017-06-07T11:28:26.503 回答
-1

您也可以使用 ActiveRecord 查找

Foo.find_by_thing('this_should_be_uniq')
Foo.find(:first, :conditions => {:thing => 'this_should_be_uniq'})

您还可以找到多个属性

Foo.find_by_attr1_and_attr2(attr1_value, attr2_value)
于 2013-09-30T15:25:29.660 回答