在rails

时间:2016-04-01 17:27:20

标签: ruby-on-rails

我有一个before_create函数,用于填充表中的列。例如      before_create:generate_number

  def generate_number 

   end 

我希望在根据条件填充列之前检查列的唯一性。

示例:如果数字是在2年前的数据库中创建的,我不希望在其上应用唯一性验证

我怎么能为它编写自定义验证。我应该把它包括在哪里?

2 个答案:

答案 0 :(得分:0)

您可以使用unlessif将逻辑应用于验证:

validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago }

这将以与您的before_create

相同的方式进入您的ActiveRecord模型
class User < ActiveRecord::Base
  #...

  validate_uniqueness_of :column_name, unless: -> { created_at < 2.years.ago }
end

答案 1 :(得分:0)

由于您在评论中指定了您希望它继续生成数字,直到生成一个尚未在数据库中的数字:

def generate_number
  begin
    value = generate
  end while created_at < 2.years.ago && Table.exists?(column: value)
  self.column = value
end

def generate
  ... # Code to generate number here
end

这继续循环while created_at列早于2年前生成的数字在数据库中。我将while条件设置在底部,以便generate在检查之前至少运行一次。

我仍然不明白created_at条件的目的,如果你想指定它应该如何工作,我可以修改那个部分。否则,我只会将其视为一个例子,而不是实际问题的一部分。