如何验证自定义作用域活动记录导轨的唯一性4

时间:2016-02-19 06:26:53

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

我有一个模型(Verification),我正在尝试验证其唯一性。

但是,我需要将状态(枚举)的唯一性范围限定如下:

class Verification < ActiveRecord::Base

  belongs_to :profile

  scope :active, -> { where('status NOT IN (?)',
                            ['approved', 'rejected'].map{ |s| self.statuses[s]
                            }
  ) }

  validates :profile, uniqueness: { scope: :active,
                                    message: "can have only one active per time." }

  enum status: [:requested, :processing, :approved, :rejected]

end

我不希望个人资料一次有多个有效验证。

但是当我像上面那样做时,它会引发错误,因为我的active表中没有名为verifications的列。

如何仅针对有效验证验证作用域的唯一性?感谢。

2 个答案:

答案 0 :(得分:2)

是的,唯一性验证中的scope关键字与Rails范围不同。它与SQL更相关,通常仅限于属性名称(或属性名称集)。

看起来您也可以通过conditions传递阻止,例如:

validates_uniqueness_of :profile, conditions: -> {  
  where('status NOT IN (?)',
         ['approved', 'rejected'].map{ |s| self.statuses[s] }
  )
}

答案 1 :(得分:1)

尝试使用proc。

validates_uniqueness_of :profile, :scope => :status, unless: Proc.new { |verification| verification.status == 'approved' || verification.status == 'rejected'}