活动记录验证:插入计算字段时的唯一性

Active Record Validations: Uniqueness of a calculated field while inserting it

我有一个模型,其中的计算字段必须是唯一的:

class MyModel < ApplicationRecord
 before_save :set_unique_identifier

 validates :unique_identifier, uniqueness: true

 private

 def set_unique_identifier
    some calculation...
    self.unique_identifier = the calculations.. (THIS IS A STRING)
 end

end  

A​​ctive Record 让我可以创建具有相同 unique_identifier.

的记录

validates :unique_identifier, uniqueness: true只有在我更新记录时才会触发

插入时如何验证?

保存 ActiveRecord 模型按以下顺序进行:

  1. 运行 before_validation 挂钩。
  2. 运行 验证。
  3. 运行 before_save 挂钩
  4. 保存。

当然还有更多内容,但这些是相关部分。

我不认为在步骤 3 中更改属性可以保证在步骤 2.

中重新运行验证

我认为您想在 before_validation 挂钩而不是 before_save 挂钩中设置唯一标识符:

class MyModel < ApplicationRecord
  before_validation :set_unique_identifier
  ...
end

这样一切都会按正确的顺序发生。

您还希望在您的数据库中包含一个唯一的 constraint/index 以真正确保您不会得到重复项。