gpt4 book ai didi

ruby-on-rails - 更改 before_save 回调中的属性以通过验证?

转载 作者:行者123 更新时间:2023-12-04 06:22:16 26 4
gpt4 key购买 nike

我有一个 Organizationiv 的模型属性(property)。如果iv没有设置,它是随机的,但它必须是唯一的。首先想到的是下面的回调。它不能用作 valid?将尝试重新验证。

class Organization < ActiveRecord::Base
validates :iv, uniqueness: true
before_save :set_default_iv

def set_default_iv
self.iv ||= random(1000)

### is it possible to validate like this?
# self.iv = random(1000) until valid?
end

最佳答案

按照建议使用 UUID 生成器,或使用某种算法自行检查唯一性(示例如下)。但是在 before_validation 中执行此操作回调,所以验证器会发现任何错误。

before_validation :set_default_iv

def set_default_iv
self.iv = random(1000) until iv.present? && !collisions_exist?
end

def collisions_exist?
class.where({:iv => iv}).
where(new_record? ? {} : ['id != ?', id]).exists?
end

请注意,此算法的性能会随着表的增长而降低,并且更可能发生冲突。 UUID 生成器肯定是推荐的方法而不是 random(1000)出于这个原因,并且因为您根本不需要手动检查碰撞。

关于ruby-on-rails - 更改 before_save 回调中的属性以通过验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14242603/

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