2014-03-06 56 views
1

我正在使用rails 4 + mongoid 4 beta1。rails + mongoid验证动态属性

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

这里是我的模型(不完全):

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 
+0

我认为这是最好的,你可以得到... –

+0

@kolas我正在使用这种方法来创建动态字段。创建动态字段更合适或将动态值存储在散列字段中,然后通过散列检索这些值?如果我使用散列,我可以转动动态属性。或者我应该同时使用哈希和动态属性。 – StarWars

回答

0

我个人认为,你应该将自定义验证你的模型,并为自己的验证器类。您应该阅读本指南,特别是关于定制验证程序的部分:http://edgeguides.rubyonrails.org/active_record_validations.html#custom-validators

P.尽管如此,你所做的并不是错误的,但是通常只有一个责任来提取复杂行为,在这种情况下,验证产品属性到自己的类中通常会更好。自定义验证器对于保持代码干燥也很好,因为您可以在任何喜欢的类中使用它们。