我的設置:Rails 3.0.9,Ruby 1.9.2保存記錄前檢查唯一值
我想在創建新記錄之前爲一列創建一個唯一的隨機數。在Ruby中這樣做最有效的方法是什麼?我明白我可以使用validates_uniqueness_of,但我想事先確保唯一性。
我的設置:Rails 3.0.9,Ruby 1.9.2保存記錄前檢查唯一值
我想在創建新記錄之前爲一列創建一個唯一的隨機數。在Ruby中這樣做最有效的方法是什麼?我明白我可以使用validates_uniqueness_of,但我想事先確保唯一性。
如果您希望在保存記錄之前絕對保證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
個人而言,我想我寧願放在列的唯一約束的數據庫和趕上的情況下所產生的異常時,您會遇到一個真正的競爭條件。
關於鎖定桌面的好建議,但正如你所說,這很重。把一個唯一的約束是一個合理的妥協,我猜會拋出一個唯一的索引約束。 – Bob
也許像... 自我是新對象
Object.currentkeys.each do currentkey
if self.key == current.key
#The key is allready in use
else
#You have unique key
end
end
怎麼樣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循環。 雖然沒有測試,但我認爲它應該工作。
不知道爲什麼你不希望數據庫來處理這個問題。 – Dex
它可能有助於知道你在使用 – klochner
@Dex的號碼是什麼,原因是因爲API是從多個設備和平臺調用的,並且錯誤處理有問題,所以我寧願不必返回錯誤。 – Bob