活动记录验证:插入计算字段时的唯一性
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
Active Record 让我可以创建具有相同 unique_identifier.
的记录
validates :unique_identifier, uniqueness: true
只有在我更新记录时才会触发
插入时如何验证?
保存 ActiveRecord 模型按以下顺序进行:
- 运行
before_validation
挂钩。
- 运行 验证。
- 运行
before_save
挂钩
- 保存。
当然还有更多内容,但这些是相关部分。
我不认为在步骤 3 中更改属性可以保证在步骤 2.
中重新运行验证
我认为您想在 before_validation
挂钩而不是 before_save
挂钩中设置唯一标识符:
class MyModel < ApplicationRecord
before_validation :set_unique_identifier
...
end
这样一切都会按正确的顺序发生。
您还希望在您的数据库中包含一个唯一的 constraint/index 以真正确保您不会得到重复项。
我有一个模型,其中的计算字段必须是唯一的:
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
Active Record 让我可以创建具有相同 unique_identifier.
的记录validates :unique_identifier, uniqueness: true
只有在我更新记录时才会触发
插入时如何验证?
保存 ActiveRecord 模型按以下顺序进行:
- 运行
before_validation
挂钩。 - 运行 验证。
- 运行
before_save
挂钩 - 保存。
当然还有更多内容,但这些是相关部分。
我不认为在步骤 3 中更改属性可以保证在步骤 2.
中重新运行验证我认为您想在 before_validation
挂钩而不是 before_save
挂钩中设置唯一标识符:
class MyModel < ApplicationRecord
before_validation :set_unique_identifier
...
end
这样一切都会按正确的顺序发生。
您还希望在您的数据库中包含一个唯一的 constraint/index 以真正确保您不会得到重复项。