2013-09-30 59 views
3

Active Record中是否存在可确保您的查询不返回多条记录的内容?Rails 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 

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

谢谢!

+0

你只想要一条记录还是第一条记录? – dax

+1

'.limit(2)'然后检查长度?但通常我会在数据库中创建唯一的索引。 –

+1

如果你正在尝试这样做是因为你的应用程序的业务逻辑规定这些事情中只有一件应该存在,那么你几乎肯定会更好地在数据库中强制执行该操作(使用唯一索引或触发器),而不是每次检查。更好地防止不良数据首先比编写代码,以便如果你得到不好的数据,你的应用程序不再工作。 – nickgrim

回答

0

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

Foo.where(:thing => 'this_should_be_uniq').limit(1) 
+1

我的问题稍有不同。我想确保查询返回单个记录,当我通过我构成'single'的方法进行选择时。即对于某些地方,我想确保只有一条记录是匹配的(而限制只会确保我收到一条记录,无论是否存在多个匹配)。 – flushentitypacket

+0

啊,我明白了...你可以多谈谈你想如何使用它?取决于你在做什么,对于唯一性使用模型验证不是更简单吗? – dax

0

你可以做Foo.where(:东西=> 'this_should_be_uniq')单或Foo.where(:东西=> 'this_should_be_uniq')。单或.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) 
-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) 
+0

这不回答这个问题; OP不需要知道如何查找东西,他们需要知道如何执行唯一性。 – nickgrim

+0

我的第一部分回答OP的问题。 find_by/find只返回一条记录。 OP究竟在问什么。第二部分是一些额外的信息。 – usha

+0

它不;问题不是“我怎么得到一件事”,而是“如果有多件事情(因为事情应该是唯一的),我该如何举报”)。 – nickgrim

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]

相关问题