moduleActiveFedora::Associations::BuilderclassAssociation#:nodoc:class<<selfattr_accessor:extensionsendself.extensions=[]VALID_OPTIONS=[:class_name,:predicate,:type_validator].freeze# configure_dependencydefself.build(model,name,options,&block)ifmodel.dangerous_attribute_method?(name)Deprecation.warn(ActiveFedora::Base,"You tried to define an association named #{name} on the model #{model.name}, but "\"this will conflict with a method #{name} already defined by ActiveFedora. "\"Please choose a different association name.")endextension=define_extensionsmodel,name,&blockreflection=create_reflectionmodel,name,nil,options,extensiondefine_accessors(model,reflection)define_callbacks(model,reflection)define_validationsmodel,reflectionreflectionenddefself.create_reflection(model,name,scope,options,extension=nil)unlessname.is_a?(Symbol)name=name.to_symDeprecation.warn(ActiveFedora::Base,"association names must be a Symbol")endvalidate_options(options)translate_property_to_predicate(options)scope=build_scope(scope,extension)name=better_name(name)ActiveFedora::Reflection.create(macro,name,scope,options,model)enddefself.build_scope(scope,extension)new_scope=scopenew_scope=proc{instance_exec(&scope)}ifscope&&scope.arity==0new_scope=wrap_scopenew_scope,extensionifextensionnew_scopeenddefself.wrap_scope(scope,_extension)scopeenddefself.macroraiseNotImplementedErrorenddefself.valid_options(_options)VALID_OPTIONS+Association.extensions.flat_map(&:valid_options)enddefself.validate_options(options)options.assert_valid_keys(valid_options(options))enddefself.better_name(name)nameenddefself.translate_property_to_predicate(options)returnunlessoptions[:property]Deprecation.warnAssociation,"the :property option to `#{model}.#{macro} :#{name}' is deprecated and will be removed in active-fedora 10.0. Use :predicate instead",caller(5)options[:predicate]=predicate(options.delete(:property))end# Returns the RDF predicate as defined by the :property attributedefself.predicate(property)returnpropertyifproperty.is_a?RDF::URIActiveFedora::Predicates.find_graph_predicate(property)enddefself.define_extensions(_model,_name)enddefself.define_callbacks(model,reflection)ifdependent=reflection.options[:dependent]check_dependent_options(dependent)add_destroy_callbacks(model,reflection)endAssociation.extensions.eachdo|extension|extension.buildmodel,reflectionendend# Defines the setter and getter methods for the association# class Post < ActiveRecord::Base# has_many :comments# end## Post.first.comments and Post.first.comments= methods are defined by this method...defself.define_accessors(model,reflection)mixin=model.generated_association_methodsname=reflection.namedefine_readers(mixin,name)define_writers(mixin,name)enddefself.define_readers(mixin,name)mixin.class_eval<<-CODE,__FILE__,__LINE__+1
def #{name}(*args)
association(:#{name}).reader(*args)
end
CODEenddefself.define_writers(mixin,name)mixin.class_eval<<-CODE,__FILE__,__LINE__+1
def #{name}=(value)
association(:#{name}).writer(value)
end
CODEenddefself.define_validations(_model,_reflection)# noopenddefself.valid_dependent_optionsraiseNotImplementedErrorenddefself.check_dependent_options(dependent)unlessvalid_dependent_options.include?dependentraiseArgumentError,"The :dependent option must be one of #{valid_dependent_options}, but is :#{dependent}"endenddefself.add_destroy_callbacks(model,reflection)name=reflection.namemodel.before_destroy->(o){o.association(name).handle_dependency}endendend