module Opto::Model::Association::HasMany::Declaration::ClassMethods

Public Instance Methods

has_many(relation, klass, options = {}) click to toggle source
# File lib/opto/model/association/has_many/declaration.rb, line 13
def has_many(relation, klass, options = {})
  if relations.include?(relation)
    raise RuntimeError, "Duplicate has_many relation '#{relation}'"
  end
  relations << relation

  define_method relation do
    if instance_variable_defined?("@#{relation}")
      instance_variable_get("@#{relation}")
    else
      instance_variable_set("@#{relation}", Proxy.new(self, klass, relation, options))
    end
  end

  define_method "#{relation}=" do |args|
    if args.kind_of?(Array)
      self.send(relation).clear
      args.each do |arg|
        if arg.kind_of?(klass)
          self.send(relation).push(arg)
        elsif arg.kind_of?(Hash)
          self.send(relation).new(arg)
        else
          raise TypeError, "Expected an instance of #{klass} or Hash"
        end
      end
      self.send(relation).members
    elsif args.kind_of?(Hash)
      self.send(relation).clear
      args.each do |k,v|
        if v.kind_of?(Hash)
          self.send(relation).new(k => v)
        else
          raise TypeError, "Expected an instance of Hash"
        end
      end
      self.send(relation).members
    elsif args.nil?
      self.send(relation).clear
    else
      raise TypeError, "Expected an instance of Array"
    end
  end
end