2014-03-06 75 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.儘管如此,你所做的並不是錯誤的,但是通常只有一個責任來提取複雜行爲,在這種情況下,驗證產品屬性到自己的類中通常會更好。自定義驗證器對於保持代碼乾燥也很好,因爲您可以在任何喜歡的類中使用它們。