Ruby on rails 是否基于datetime属性而不是值的存在进行唯一验证?
我希望根据是否存在另一个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
验证:促销代码,唯一性:{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? }