首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails为在数据库中保存创建唯一的价值。

Rails为在数据库中保存创建唯一的价值。
EN

Stack Overflow用户
提问于 2020-05-09 12:55:19
回答 4查看 553关注 0票数 0

我的意思是不检查储蓄是当前的价值-独特的。

如何创造价值(例如,在我的模型中),检查它对我的表是否是唯一的。Anf也许不会尝试创造新的价值。并再次检查其唯一性

现在,我的模型中有以下代码:

代码语言:javascript
复制
  after_initialize :init

  def init
    self.some_field = rand(1..99_999_999).to_s
  end
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-09 16:39:37

你可以使用模型回调,

代码语言:javascript
复制
before_create :generate_some_field

def generate_some_field
  self.some_field = loop do
    random = rand(1..99_999_999).to_s
    break random unless ModelName.exists?(some_field: random)
  end
end
票数 2
EN

Stack Overflow用户

发布于 2020-05-09 14:23:10

添加验证

然后设置值,检查它,

如果好的话:,它完成了。

如果不是再试一次,重复合理的次数。

就像这样

代码语言:javascript
复制
 validates :some_field, uniqueness: true 

 def init
    attempts = 0
    loop do
      self.some_field  <<  SecureRandom.uuid.to_s[0..16]
      self.valid?
      break unless self.errors[:some_field].any?
      attempts = attempts + 1
      if attempts > 3
         self.errors[:some_field] << "Could not generate a unique value after #{attempts} attempts"
         break
      end
    end

  end
票数 1
EN

Stack Overflow用户

发布于 2020-05-09 19:08:56

添加唯一性验证,并在验证之前初始化字段。添加最大重试限制,以避免在记录数接近或达到可能随机值的最大数目时可能出现的死锁。

代码语言:javascript
复制
  INITIALIZATION_MAX_RETRIES = 10
  before_validation :initialize_fields

  validates_uniqueness_of :some_field

  private

  def initialize_fields
    unless some_field
      retries = 0
      loop do
        retries += 1
        break if retries > INITIALIZATION_MAX_RETRIES

        self.some_field = rand(1..99_999_999).to_s
        break unless self.class.find_by(some_field: some_field)
      end
    end
  end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61697046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档