我正在使用 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