lib/mongo_mapper/plugins/associations.rb in mongo_mapper-0.8.6 vs lib/mongo_mapper/plugins/associations.rb in mongo_mapper-0.9.0
- old
+ new
@@ -1,95 +1,90 @@
# encoding: UTF-8
module MongoMapper
module Plugins
module Associations
+ extend ActiveSupport::Concern
+
module ClassMethods
def inherited(subclass)
subclass.associations = associations.dup
super
end
def belongs_to(association_id, options={}, &extension)
- create_association(:belongs_to, association_id, options, &extension)
+ create_association(BelongsToAssociation.new(association_id, options, &extension))
end
def many(association_id, options={}, &extension)
- create_association(:many, association_id, options, &extension)
+ create_association(ManyAssociation.new(association_id, options, &extension))
end
def one(association_id, options={}, &extension)
- create_association(:one, association_id, options, &extension)
+ create_association(OneAssociation.new(association_id, options, &extension))
end
def associations
- @associations ||= HashWithIndifferentAccess.new
+ @associations ||= {}
end
def associations=(hash)
@associations = hash
end
- private
- def create_association(type, name, options, &extension)
- association = Associations::Base.new(type, name, options, &extension)
- associations[association.name] = association
+ def associations_module_defined?
+ if method(:const_defined?).arity == 1 # Ruby 1.9 compat check
+ const_defined?('MongoMapperAssociations')
+ else
+ const_defined?('MongoMapperAssociations', false)
+ end
+ end
- define_method(association.name) do
- get_proxy(association)
+ def associations_module
+ if associations_module_defined?
+ const_get 'MongoMapperAssociations'
+ else
+ Module.new.tap do |m|
+ const_set 'MongoMapperAssociations', m
+ include m
end
+ end
+ end
- define_method("#{association.name}=") do |value|
- get_proxy(association).replace(value)
- value
- end
-
- if association.one? || association.belongs_to?
- define_method("#{association.name}?") do
- get_proxy(association).present?
- end
- end
-
- if association.options[:dependent] && association.many? && !association.embeddable?
- after_destroy do |doc|
- case association.options[:dependent]
- when :destroy
- doc.get_proxy(association).destroy_all
- when :delete_all
- doc.get_proxy(association).delete_all
- when :nullify
- doc.get_proxy(association).nullify
- end
- end
- end
+ private
+ def create_association(association)
+ associations[association.name] = association
+ association.setup(self)
end
end
module InstanceMethods
def associations
self.class.associations
end
def embedded_associations
- associations.select do |name, association|
- association.embeddable?
- end.map do |name, association|
- association
- end
+ associations.values.select { |assoc| assoc.embeddable? }
end
+ def build_proxy(association)
+ proxy = association.proxy_class.new(self, association)
+ self.instance_variable_set(association.ivar, proxy)
+
+ proxy
+ end
+
def get_proxy(association)
unless proxy = self.instance_variable_get(association.ivar)
- proxy = association.proxy_class.new(self, association)
- self.instance_variable_set(association.ivar, proxy)
+ proxy = build_proxy(association)
end
proxy
end
def save_to_collection(options={})
- super
+ super if defined?(super)
associations.each do |association_name, association|
proxy = get_proxy(association)
- proxy.save_to_collection(options) if proxy.proxy_respond_to?(:save_to_collection)
+ proxy.save_to_collection(options) if proxy.proxy_respond_to?(:save_to_collection) && association.autosave?
end
end
end
end
end