使用自定义条件验证唯一性

时间:2014-08-10 18:02:16

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

模型中,我有:

validates :special_code, presence: true, uniqueness: true
before_save :special_code, :regenerate_special_code

控制器

def special_code
  ( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join                
end

我想要做的是重新生成special_code(如果它不是唯一的)。 伪代码:

def regenerate_special_code
  special_code if special_code != unique
end

目前rails只输出一个错误,说“special_code不是唯一的”。 (我不希望这种情况发生。用户永远不应该看到这个错误。它应该只调用regenrate_special_code,直到创建一个唯一的代码,然后将记录存储到数据库。)

1 个答案:

答案 0 :(得分:0)

model.rb

....
before_save :generate_special_code
....
private
  def generate_special_code
    self.special_code = ( (0...8).map { char = (65 + rand(26)).chr; }[0..rand(2...4)] << rand(1..9) ).join
    generate_special_code if Model.exsits?(special_code: self.special_code)
  end
....

不需要此validate行和regenerate_special_code。我的示例将生成一些special_code,直到它唯一。

PS。我会调查SecureRandom,看起来你试图为你的模型生成一个随机令牌,这可以用SecureRandom.uuid

之类的东西来完成。