module Embedded::Model

Constants

ScopeMethod

Public Instance Methods

embedded() click to toggle source
# File lib/embedded/model.rb, line 17
def embedded
  Embedded::Scope.new(send(ScopeMethod),embedded_attributes)
end
embedded_attributes() click to toggle source
# File lib/embedded/model.rb, line 21
def embedded_attributes
  @embedded_attributes ||= {}
end
embedded_column_names(embeddable_attr, attributes) click to toggle source
# File lib/embedded/model.rb, line 5
def embedded_column_names(embeddable_attr, attributes)
  if attributes.is_a?(Array)
    attributes.inject({}) do |hash, a|
      hash.merge(:"#{embeddable_attr}_#{a}" => a)
    end
  elsif attributes.is_a?(Hash)
    attributes.invert
  else
    raise ArgumentError.new('invalid attributes')
  end
end
embeds(embeddable_attr, options = {}) click to toggle source
# File lib/embedded/model.rb, line 25
def embeds(embeddable_attr, options = {})
  self.embedded_attributes[embeddable_attr] = options

  attributes = options[:attrs]
  columns = embedded_column_names(embeddable_attr,attributes)
  clazz = options[:class_name] ? options[:class_name].constantize : embeddable_attr.to_s.camelcase.constantize

  self.send(:define_method, embeddable_attr) do
    values = columns.inject({}) do |hash,(k,v)|
      hash.merge(v=>read_attribute(k))
    end
    clazz.new(values)
  end

  self.send(:define_method, :"#{embeddable_attr}=") do |v|
    if v.is_a?(clazz)
      columns.each do |k,a|
        write_attribute(k, v.send(a))
      end
    elsif v.is_a?(Hash)
      columns.each do |k,a|
        write_attribute(k, v[a])
      end
    else
      raise ArgumentError.new("invalid class. #{clazz.to_s} or Hash was expected")
    end
  end
end