【问题标题】:Adding uniqueness validation for dynamic attributes in rails为 Rails 中的动态属性添加唯一性验证
【发布时间】:2020-11-26 15:42:02
【问题描述】:

我们有一个多租户应用程序,其中每个帐户的验证都不同。我们可以很容易地实现这一点,如下所示,

module CommonValidator
  def add_custom_validation
    required_fields = get_required_fields
    return if required_fields.blank?

    validates_presence_of required_fields.map(&:to_sym)
  end
end

class ApplicationRecord < ActiveRecord::Base
  include Discard::Model
  include CommonValidator
end

然后我们必须添加基于帐户的唯一性验证,所以尝试相同。但得到未定义的方法错误。有什么办法可以让我完成这项工作?

module CommonValidator
  def add_custom_validation
    unique_fields = ['first_name']
    validates_uniqueness_of unique_fields.map(&:to_sym) if unique_fields.present?
  end
end

【问题讨论】:

  • 你重新加载控制台了吗?
  • 是的,重新加载了控制台。 validates_numericality_of 等其他验证方法运行良好。独特验证的奇怪之处

标签: ruby-on-rails validation activemodel validates-uniqueness-of


【解决方案1】:

validates_uniqueness_of 实际上是一个类方法(在ActiveRecord::Validations::ClassMethods 中定义),因此您无法从对象的上下文中调用它。

validates_presence_of 既是帮助方法,也是类方法(在ActiveModel::Validations::HelperMethodsActiveRecord::Validations::ClassMethods 中定义)。

如果您想使用唯一性验证器,您也可以将add_custom_validation 定义为类方法,然后您应该可以使用它。类似的,

require 'active_support/concern'

module CommonValidator
  extend ActiveSupport::Concern

  included do
    add_custom_validation
  end

  class_methods do
    def add_custom_validation
      required_fields = get_required_fields # This will also need to be a class method now
      return if required_fields.blank?
      
      validates_uniqueness_of required_fields.map(&:to_sym)
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多