module ZTK::DSL::Core::Relations::HasMany::ClassMethods

@author Zachary Patten <zpatten AT jovelabs DOT io>

Public Instance Methods

has_many(key, options={}) click to toggle source
# File lib/ztk/dsl/core/relations/has_many.rb, line 43
def has_many(key, options={})
  has_many_relations[key] = {
    :class_name => key.to_s.classify,
    :key => key
  }.merge(options)

  define_method(key) do |*args|
    if args.count == 0
      get_has_many_reference(key)
    else
      send("#{key}=", *args)
    end
  end

  define_method("#{key}=") do |value|
    set_has_many_reference(key, value)
  end

  define_method(key.to_s.singularize) do |id=nil, &block|
    options = self.class.has_many_relations[key]
    data = options[:class_name].constantize.new(id, &block)
    get_has_many_reference(key) << data

    klass = self.class.to_s.demodulize.singularize.downcase

    data.send("#{klass}=", self)
    data
  end
end