gpt4 book ai didi

ruby-on-rails - 确保应用程序级别的唯一列值

转载 作者:行者123 更新时间:2023-12-04 00:24:10 25 4
gpt4 key购买 nike

我正在处理的 Rails 3.1 应用程序中的一个模型有一个“代码”属性,该属性在创建记录时自动生成并且必须是唯一的。应用程序应检查数据库以查看生成的代码是否存在,如果存在,则应生成新代码并重复该过程。

我可以使用 add_index :credits, :code, :unique => true(我正在做的)确保字段在数据库级别的唯一性,也可以使用 validates_uniqueness_of,但是如果生成的代码存在,这两个都将简单地返回一个错误。如果重复,我需要再试一次。生成的代码足够长,不太可能出现重复,但我需要 100% 确定。

此代码生成对最终用户是透明处理的,因此他们永远不会看到错误。生成代码后,检查代码是否存在并重复该过程直到找到唯一值的最佳方法是什么?

最佳答案

这是一个简单的例子,从技术上讲,这里仍然存在竞争条件,但除非您每秒看到成百上千个创建,否则真的不应该担心,最坏的情况是如果运行两个创建,您的用户会收到唯一性错误这样他们都执行查找并使用相同的 Url 返回 nil

class Credit < ActiveRecord::Base
before_validation :create_code, :if => 'self.new_record?'
validates :code, :uniqueness => true

def create_code
self.code = code_generator
self.code = code_generator until Credit.find_by_code(code).nil?
end
end

如果您绝对需要删除两个创建串联运行的竞争条件情况,并且都使用相同的代码触发查找并返回 nil,您可以使用表锁包装查找,这需要特定于数据库的 SQL,或者您可以创建一个表,其中一行用于通过悲观锁定进行锁定,但我不会走那么远,除非您期望每秒创建数百次并且您绝对要求用户永远不会看到错误,这是可行的,只是有点在大多数情况下矫枉过正。

关于ruby-on-rails - 确保应用程序级别的唯一列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7576045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com