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