2011-07-07 110 views
0

我的設置:Rails 3.0.9,Ruby 1.9.2保存記錄前檢查唯一值

我想在創建新記錄之前爲一列創建一個唯一的隨機數。在Ruby中這樣做最有效的方法是什麼?我明白我可以使用validates_uniqueness_of,但我想事先確保唯一性。

+1

不知道爲什麼你不希望數據庫來處理這個問題。 – Dex

+0

它可能有助於知道你在使用 – klochner

+0

@Dex的號碼是什麼,原因是因爲API是從多個設備和平臺調用的,並且錯誤處理有問題,所以我寧願不必返回錯誤。 – Bob

回答

1

如果您希望在保存記錄之前絕對保證Ruby的唯一性,然後將其包含在事務中並鎖定表。請注意,這可能會對您的表現產生重大影響。

self.class.transaction do 
    connection.execute('LOCK TABLES table_name WRITE') 

    # do your random generation until uniqueness validation passes here 

    connection.execute('UNLOCK TABLES') 
end 

個人而言,我想我寧願放在列的唯一約束的數據庫和趕上的情況下所產生的異常時,您會遇到一個真正的競爭條件。

+0

關於鎖定桌面的好建議,但正如你所說,這很重。把一個唯一的約束是一個合理的妥協,我猜會拋出一個唯一的索引約束。 – Bob

0

也許像... 自我是新對象

Object.currentkeys.each do currentkey 
    if self.key == current.key 
    #The key is allready in use 

    else 
    #You have unique key 
    end 
end 
2

怎麼樣before_create或before_save AR回調?

喜歡的東西:

class ModelNameHere < ActiveRecord::Base 
    before_create :generate_unique_number 

    private 
    def generate_unique_number 
     begin 
     self.number = unique_number_generator() 
     end while (not ModelNameHere.find_by_number(self.number).blank?) 
    end 

的BEGIN..END而基本上是從this answer採取do-while循環。 雖然沒有測試,但我認爲它應該工作。