Module: Embedded::Model

Defined in:
lib/embedded/model.rb

Constant Summary collapse

ScopeMethod =
ActiveRecord::VERSION::MAJOR >= 4 ? :all.freeze : :scoped.freeze

Instance Method Summary collapse

Instance Method Details

#embeddedObject



17
18
19
# File 'lib/embedded/model.rb', line 17

def embedded
  Embedded::Scope.new(send(ScopeMethod),embedded_attributes)
end

#embedded_attributesObject



21
22
23
# File 'lib/embedded/model.rb', line 21

def embedded_attributes
  @embedded_attributes ||= {}
end

#embedded_column_names(embeddable_attr, attributes) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
# 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 = {}) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 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