2013-09-30 91 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]

相關問題