【问题标题】:how to validate uniqueness for custom scope active-record rails 4如何验证自定义范围活动记录轨道的唯一性 4
【发布时间】:2016-02-19 06:26:53
【问题描述】:

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

但是,我需要将唯一性限定为 status(enum),如下所示:

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

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

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

如何验证仅适用于主动验证的配置文件的唯一性?谢谢。

【问题讨论】:

  • 是的,唯一性验证中的scope 关键字与Rails scope 不同。它与SQL 更相关。

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


【解决方案1】:

是的,唯一性验证中的作用域关键字与 Rails 作用域不同。它与 SQL 更相关,通常仅限于一个属性名称(或一组属性名称)。

看起来你也可以通过conditions 传递一个块,例如:

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

【讨论】:

  • 谢谢...我认为您是正确的,我可以通过条件,但看起来条件的语法不正确...我还想不通...我有错误:syntax error, unexpected '\n', expecting =&gt; 和全班休息。我认为条件应该是key=&gt;value 对。检查...
  • 所以...我明白了...validates_uniqueness_of :profile, conditions: -&gt; {}。谢谢。
  • 哎呀,应该是一个“刺痛的 lambda”,而不仅仅是一个块;)
【解决方案2】:

尝试使用 proc。

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

【讨论】:

  • 谢谢...在尝试此操作时,我收到了 ArgumentError 错误:ArgumentError: Unknown validator: 'UniqueValidator
  • 这与我的问题没有什么不同。这将在verifications 表中查找active 列,其中没有该列,并相应地引发PG::UndefinedColumn 错误。
  • 我发错了,更新了ans,请尝试使用proc。
  • 嗯...这没有考虑到过程。它只是验证状态的唯一性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多