Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 是否基于datetime属性而不是值的存在进行唯一验证?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 是否基于datetime属性而不是值的存在进行唯一验证?

Ruby on rails 是否基于datetime属性而不是值的存在进行唯一验证?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我希望根据是否存在另一个datetime属性,字段是唯一的 比如: 验证:促销代码,唯一性:{scope:[:archived_at]} 通过: 失败: 只有通过自定义验证器才能做到这一点吗?以下是我正在做的 validate :unique_code, if: :code private def unique_code return if archived_at.present? if self.class.unarchived.where.not(id: id

我希望根据是否存在另一个datetime属性,字段是唯一的

比如:

验证:促销代码,唯一性:{scope:[:archived_at]}

通过:

失败:

只有通过自定义验证器才能做到这一点吗?

以下是我正在做的

  validate :unique_code, if: :code

  private

  def unique_code
    return if archived_at.present?
    if self.class.unarchived.where.not(id: id).exists?(code: code, company: company)
      errors.add :code, :invalid
      false
    end
  end
试试这个,用


我想你是对的。您必须为此使用自定义验证。
scope
选项必须是数据库中的一个属性。很好,这更干净而且有效。最终解决方案:验证:代码,唯一性:{scope:[:company\u id,:archived\u at]},允许\u nil:true,除非::archived\u at
promo_code = TENOFF, archived_at = null

promo_code = TENOFF, archived_at = null
  validate :unique_code, if: :code

  private

  def unique_code
    return if archived_at.present?
    if self.class.unarchived.where.not(id: id).exists?(code: code, company: company)
      errors.add :code, :invalid
      false
    end
  end
validates :promo_code, uniqueness: { scope: [:archived_at] }, unless: Proc.new { |o| o.archived_at.blank? }