Module | ActiveLdap::Associations::ClassMethods |
In: |
lib/active_ldap/associations.rb
|
VALID_BELONGS_TO_OPTIONS | = | [:class, :class_name, :foreign_key, :primary_key, :many, :extend] |
VALID_HAS_MANY_OPTIONS | = | [:class, :class_name, :foreign_key, :primary_key, :wrap, :extend] |
# File lib/active_ldap/associations.rb, line 26 26: def associated_class(name) 27: @associated_classes[name.to_s] 28: end
This defines a method for an extension class map its DN key attribute value on to multiple items which reference it by |:foreign_key| in the other LDAP entry covered by class |:class_name|.
Example:
belongs_to :groups, :class_name => "Group", :many => "memberUid" # Group#memberUid # :foreign_key => "uid" # User#uid # dn attribute value is used by default belongs_to :primary_group, :class_name => "Group", :foreign_key => "gidNumber", # User#gidNumber :primary_key => "gidNumber" # Group#gidNumber
# File lib/active_ldap/associations.rb, line 46 46: def belongs_to(association_id, options={}) 47: validate_belongs_to_options(options) 48: klass = options[:class] 49: klass ||= (options[:class_name] || association_id.to_s).classify 50: foreign_key = options[:foreign_key] 51: primary_key = options[:primary_key] 52: many = options[:many] 53: set_associated_class(association_id, klass) 54: 55: opts = { 56: :association_id => association_id, 57: :foreign_key_name => foreign_key, 58: :primary_key_name => primary_key, 59: :many => many, 60: :extend => options[:extend], 61: } 62: if opts[:many] 63: association_class = Association::BelongsToMany 64: opts[:foreign_key_name] ||= dn_attribute 65: else 66: association_class = Association::BelongsTo 67: opts[:foreign_key_name] ||= "#{association_id}_id" 68: 69: before_save("if defined?(@\#{association_id})\nassociation = @\#{association_id}\nif association and association.updated?\nself[association.__send__(:primary_key)] =\nassociation[\#{opts[:foreign_key_name].dump}]\nend\nend\n") 70: end 71: 72: association_accessor(association_id) do |target| 73: association_class.new(target, opts) 74: end 75: end
This defines a method for an extension class expand an existing multi-element attribute into ActiveLdap objects. This discards any calls which result in entries that don‘t exist in LDAP!
Example:
has_many :primary_members, :class_name => "User", :primary_key => "gidNumber", # User#gidNumber :foreign_key => "gidNumber" # Group#gidNumber has_many :members, :class_name => "User", :wrap => "memberUid" # Group#memberUid
# File lib/active_ldap/associations.rb, line 100 100: def has_many(association_id, options = {}) 101: validate_has_many_options(options) 102: klass = options[:class] 103: klass ||= (options[:class_name] || association_id.to_s).classify 104: foreign_key = options[:foreign_key] || "#{association_id}_id" 105: primary_key = options[:primary_key] 106: set_associated_class(association_id, klass) 107: 108: opts = { 109: :association_id => association_id, 110: :foreign_key_name => foreign_key, 111: :primary_key_name => primary_key, 112: :wrap => options[:wrap], 113: :extend => options[:extend], 114: } 115: if opts[:wrap] 116: association_class = Association::HasManyWrap 117: else 118: association_class = Association::HasMany 119: end 120: 121: association_accessor(association_id) do |target| 122: association_class.new(target, opts) 123: end 124: end
# File lib/active_ldap/associations.rb, line 21 21: def set_associated_class(name, klass) 22: @associated_classes ||= {} 23: @associated_classes[name.to_s] = klass 24: end
# File lib/active_ldap/associations.rb, line 127 127: def association_accessor(name, &make_association) 128: define_method("__make_#{name}") do 129: make_association.call(self) 130: end 131: associations << name 132: association_reader(name, &make_association) 133: association_writer(name, &make_association) 134: end
# File lib/active_ldap/associations.rb, line 136 136: def association_reader(name, &make_association) 137: class_eval("def \#{name}\n@\#{name} ||= __make_\#{name}\nend\n", __FILE__, __LINE__ + 1) 138: end
# File lib/active_ldap/associations.rb, line 145 145: def association_writer(name, &make_association) 146: class_eval("def \#{name}=(new_value)\nassociation = defined?(@\#{name}) ? @\#{name} : nil\nassociation ||= __make_\#{name}\nassociation.replace(new_value)\n@\#{name} = new_value.nil? ? nil : association\n@\#{name}\nend\n", __FILE__, __LINE__ + 1) 147: end
# File lib/active_ldap/associations.rb, line 161 161: def validate_belongs_to_options(options) 162: options.assert_valid_keys(VALID_BELONGS_TO_OPTIONS) 163: end