Module: DataMapper::Associations::OneToMany
Public Visibility
Public Instance Method Summary
| #setup(name, model, options = {}) |
Setup one to many relationship between two models. |
|---|
Public Instance Method Details
setup
public
setup(name, model, options = {})
Setup one to many relationship between two models
[View source]
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
# File 'dm-core/lib/dm-core/associations/one_to_many.rb', line 10 def setup(name, model, options = {}) raise ArgumentError, "+name+ should be a Symbol (or Hash for +through+ support), but was #{name.class}", caller unless Symbol === name || Hash === name raise ArgumentError, "+options+ should be a Hash, but was #{options.class}", caller unless Hash === options repository_name = model.repository.name model.class_eval "def \#{name}(options = {})\noptions.empty? ? \#{name}_association : \#{name}_association.all(options)\nend\n\ndef \#{name}=(children)\n\#{name}_association.replace(children)\nend\n\nprivate\n\ndef \#{name}_association\n@\#{name}_association ||= begin\nrelationship = self.class.relationships(\#{repository_name.inspect})[\#{name.inspect}]\nraise ArgumentError.new(\"Relationship \#{name.inspect} does not exist\") unless relationship\nassociation = Proxy.new(relationship, self)\nparent_associations << association\nassociation\nend\nend\n", __FILE__, __LINE__ model.relationships(repository_name)[name] = if options.has_key?(:through) RelationshipChain.new( :child_model_name => options.fetch(:class_name, Extlib::Inflection.classify(name)), :parent_model_name => model.name, :repository_name => repository_name, :near_relationship_name => options[:through], :remote_relationship_name => options.fetch(:remote_name, name), :parent_key => options[:parent_key], :child_key => options[:child_key] ) else Relationship.new( Extlib::Inflection.underscore(Extlib::Inflection.demodulize(model.name)).to_sym, repository_name, options.fetch(:class_name, Extlib::Inflection.classify(name)), model.name, options ) end end