【问题标题】:Can validate_uniqueness_of work with custom scopes?validate_uniqueness_of 可以与自定义范围一起使用吗?
【发布时间】:2014-02-15 18:41:37
【问题描述】:

我正在处理一个 RoR 项目,我想对我的一个模型进行唯一性验证,以检查自定义范围:

class Keyword < ActiveRecord::Base
  belongs_to :keyword_list

  scope :active, -> { where("expiration > ?", DateTime.now) }

  validates :name, uniqueness: { scope: [:active, :keyword_list_id] }
end

只是,这不起作用。它检查数据库中不存在的活动列并抛出此错误:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column keywords.active does not exist

那么,我的问题是有什么方法可以使这项工作,还是我必须编写一个自定义验证器?如果是这样,是否有关于过度访问数据库应该是什么样子的任何提示?

【问题讨论】:

    标签: ruby-on-rails validation activerecord activemodel named-scopes


    【解决方案1】:

    不,您必须编写自定义验证。

    试试这个。

    # In app/models/keyword.rb
    
    validate :freshness
    
    private
    
    def freshness
      if Keyword.active.find_by(name: self.name, keyword_list_id: self.keyword_list_id)
        errors.add(:base, "Name is not fresh enough.") # Fails the validation with error message
      end
    end
    

    还有一个有趣的地方,你不能依赖validates_uniqueness_of,或者rails中的任何其他唯一性验证器,因为验证不是原子运行的,这意味着如果同时插入两条相同的记录,并且没有 SQL 约束 验证唯一性,ruby 验证将通过并且两条记录都将被插入。

    我在这里想说的是,如果您的验证是关键任务,请使用 SQL 约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多