class ActiveFedora::Associations::Builder::Association
:nodoc:
def self.add_destroy_callbacks(model, reflection)
def self.add_destroy_callbacks(model, reflection) name = reflection.name model.before_destroy lambda do |o| a = o.association(name) a.handle_dependency if a.respond_to? :handle_dependency end end
def self.build(model, name, options, &block)
def self.build(model, name, options, &block) if model.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.") end extension = define_extensions model, name, &block reflection = create_reflection model, name, nil, options, extension define_accessors(model, reflection) define_callbacks(model, reflection) define_validations model, reflection reflection end
def self.check_dependent_options(dependent)
def self.check_dependent_options(dependent) unless valid_dependent_options.include? dependent raise ArgumentError, "The :dependent option must be one of #{valid_dependent_options}, but is :#{dependent}" end end
def self.create_reflection(model, name, _scope, options, _extension = nil)
def self.create_reflection(model, name, _scope, options, _extension = nil) unless name.is_a?(Symbol) name = name.to_sym Deprecation.warn(ActiveFedora::Base, "association names must be a Symbol") end validate_options(options) new(model, name, options).build end
def self.define_accessors(model, reflection)
end
has_many :comments
class Post < ActiveRecord::Base
Defines the setter and getter methods for the association
def self.define_accessors(model, reflection) mixin = model.generated_association_methods name = reflection.name define_readers(mixin, name) define_writers(mixin, name) end
def self.define_callbacks(model, reflection)
def self.define_callbacks(model, reflection) if dependent = reflection.options[:dependent] check_dependent_options(dependent) add_destroy_callbacks(model, reflection) end Association.extensions.each do |extension| extension.build model, reflection end end
def self.define_extensions(_model, _name)
def self.define_extensions(_model, _name) end
def self.define_readers(mixin, name)
def self.define_readers(mixin, name) mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1 def #{name}(*args) association(:#{name}).reader(*args) end CODE end
def self.define_validations(_model, _reflection)
def self.define_validations(_model, _reflection) # noop end
def self.define_writers(mixin, name)
def self.define_writers(mixin, name) mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1 def #{name}=(value) association(:#{name}).writer(value) end CODE end
def self.macro
def self.macro raise NotImplementedError end
def self.valid_dependent_options
def self.valid_dependent_options raise NotImplementedError end
def self.valid_options(_options)
def self.valid_options(_options) VALID_OPTIONS + Association.extensions.flat_map(&:valid_options) end
def self.validate_options(options)
def self.validate_options(options) options.assert_valid_keys(valid_options(options)) end
def build
def build configure_dependency if options[:dependent] # see https://github.com/rails/rails/commit/9da52a5e55cc665a539afb45783f84d9f3607282 model.create_reflection(self.class.macro, name, options, model) end
def configure_dependency
def configure_dependency return unless options[:dependent] return if model.association(name).respond_to? :handle_dependency unless [:destroy, :delete].include?(options[:dependent]) raise ArgumentError, "The :dependent option expects either :destroy or :delete (#{options[:dependent].inspect})" end method_name = "belongs_to_dependent_#{options[:dependent]}_for_#{name}" model.send(:class_eval, <<-eoruby, __FILE__, __LINE__ + 1) def #{method_name} association = #{name} association.#{options[:dependent]} if association end eoruby model.after_destroy method_name end
def initialize(model, name, options)
def initialize(model, name, options) @model = model @name = name @options = options translate_property_to_predicate validate_options end
def predicate(property)
def predicate(property) return property if property.is_a? RDF::URI ActiveFedora::Predicates.find_graph_predicate(property) end
def translate_property_to_predicate
def translate_property_to_predicate return unless options[:property] Deprecation.warn Association, "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
def validate_options
def validate_options self.class.validate_options(options) end