module MongoidNestedFields::NestedFieldSetter::ClassMethods

Public Instance Methods

_allowed_types_in_field(field) click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 54
def _allowed_types_in_field(field)
  field = field.to_sym
  @_allowed_types_in_field ||= {}
  return @_allowed_types_in_field[field] || []
end
_is_allowed_type?(field, type) click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 59
def _is_allowed_type?(field, type)
  field = field.to_sym
  _allowed_types_in_field(field).include?(type)
end
_set_allowed_types_in_field(field, type) click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 46
def _set_allowed_types_in_field(field, type)
  field = field.to_sym
  @_allowed_types_in_field ||= {}
  @_allowed_types_in_field[field] ||= []
  @_allowed_types_in_field[field] << type
  @_allowed_types_in_field[field].flatten!
  @_allowed_types_in_field[field].uniq! unless @_allowed_types_in_field[field].nil?
end
_set_serialization() click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 37
def _set_serialization
  before_save :_serialize_nested_fields
  after_save  :_restore_nested_fields
end
_set_validations() click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 42
def _set_validations
  validate :_nested_fields_must_be_valid
end
nested_field(name, options = {}) click to toggle source
# File lib/mongoid_nested_fields/nested_field_setter.rb, line 6
def nested_field(name, options = {})
  @_nested_fields ||= []
  @_nested_fields << name.to_s
  options[:type] = MongoidNestedFields::NestedFieldHolder
  
  _set_allowed_types_in_field(name, options.delete(:allowed_types))      
  _set_validations
  _set_serialization

  field(name, options)
  meth = options.delete(:as) || name
  define_method("#{meth}=") do |value|
    raise TypeError unless [String, Array, NilClass].include?(value.class)
    if value.is_a? String
      parser = Yajl::Parser.new
      value = parser.parse(value)
    end
    processed_values = []
    value.to_a.each do |v|
      v.stringify_keys! if v.is_a? Hash
      if((v.is_a?(Hash) or v.is_a?(BSON::OrderedHash)) and !v['_type'].nil?)
        v = v['_type'].classify.constantize.new(v.to_hash)
      end
      raise MongoidNestedFields::Errors::UnexpectedType.new(v.class, name) unless self.class._is_allowed_type?(name, v.class)
      processed_values << v
    end
    write_attribute(name, processed_values)
  end
  
end