2

我正在使用 rails 4 + mongoid 4 beta1。

产品属于类别,具有基于类别的动态属性。我使用自定义方法验证动态属性,但它看起来很难看。如何在我的自定义方法中使用标准验证方法,或者有更好的方法?

这是我的模型(不完整):

class Product
  include Mongoid::Document
  include Mongoid::Attributes::Dynamic

  belongs_to :category

  before_validation :custom_field_to_datatype

  validates :category_id, :presence => true
  validate :custom_fields_validator

  private
    def custom_field_to_datatype
      self.category.product_attributes.each do |pr_at|
        name = pr_at.name.to_sym
        if pr_at.type == 'boolean'
          self[name] = self[name].to_bool
        elsif pr_at.type == 'integer'
          self[name] = self[name].to_i
        end
      end
    end

    def custom_fields_validator
      max_length = 30
      max_integer = 9223372036854775807
      min_integer = -9223372036854775807

      self.category.product_attributes.each do |pr_at|
        name = pr_at.name.to_sym

        case pr_at.type
        when 'string'
          errors.add(name, "Длина строки должна быть не больше #{max_length} символов") if self[name].length > max_length
        when 'integer'
          if self[name] > max_integer
            errors.add(name, "Значение должно быть не больше #{max_integer}")
          elsif self[name] < min_integer
            errors.add(name, "Значение должно быть не меньше #{min_integer}")
          end
        end
      end
    end

end
4

1 回答 1

1

就个人而言,我认为您应该将自定义验证器从您的模型中移出并移到它自己的验证器类中。您应该阅读本指南,尤其是有关自定义验证器的部分:http: //edgeguides.rubyonrails.org/active_record_validations.html#custom-validators

Ps 你所做的并没有错,但通常最好将复杂的行为提取到它自己的类中,只负责一项职责,在这种情况下是验证产品属性。自定义验证器也非常适合保持代码干爽,因为您可以在任何您喜欢的类中使用它们。

于 2014-03-06T06:26:28.020 回答