Rails为保存在数据库中创造了独特的价值

问题描述 投票:0回答:1

我的意思是不要检查保存当前的值 - 唯一的。

我怎样才能创建值(例如在我的模型中),检查它对我的表是否是唯一的。Anf id not than try to create new value maybe. 并再次检查唯一性

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

  after_initialize :init

  def init
    self.some_field = rand(1..99_999_999).to_s
  end
ruby-on-rails database model initialization unique
1个回答
1
投票

你可以使用模型回调,比如

before_create :generate_token

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

1
投票

增加一个验证

然后设置数值,检查一下。

如果好。 它的完成。

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

就像这样

 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
投票

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

  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
投票

最近我自己写了一个 gem 来解决这个问题。https:/github.cominemshufflino。

用这种方法不需要重试,也不需要额外的SQL查询。

我还推荐观看 此话 关于这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.