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 # :primary_key => "uid" # User#uid ## deprecated since 1.1.0. Use :primary_key instead. ## :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 48 48: def belongs_to(association_id, options={}) 49: validate_belongs_to_options(options) 50: klass = options[:class] 51: klass ||= (options[:class_name] || association_id.to_s).classify 52: foreign_key = options[:foreign_key] 53: primary_key = options[:primary_key] 54: many = options[:many] 55: set_associated_class(association_id, klass) 56: 57: opts = { 58: :association_id => association_id, 59: :foreign_key_name => foreign_key, 60: :primary_key_name => primary_key, 61: :many => many, 62: :extend => options[:extend], 63: } 64: if opts[:many] 65: association_class = Association::BelongsToMany 66: foreign_key_name = opts[:foreign_key_name] 67: if foreign_key_name 68: message = _(":foreign_key belongs_to(:many) option is " \ 69: "deprecated since 1.1.0. Use :primary_key instead.") 70: ActiveSupport::Deprecation.warn(message) 71: opts[:primary_key_name] ||= foreign_key_name 72: end 73: opts[:primary_key_name] ||= dn_attribute 74: else 75: association_class = Association::BelongsTo 76: opts[:foreign_key_name] ||= "#{association_id}_id" 77: 78: 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") 79: end 80: 81: association_accessor(association_id) do |target| 82: association_class.new(target, opts) 83: end 84: 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", # Group#gidNumber :foreign_key => "gidNumber" # User#gidNumber ## deprecated since 1.1.0. Those options ## are inverted. # :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 113 113: def has_many(association_id, options = {}) 114: validate_has_many_options(options) 115: klass = options[:class] 116: klass ||= (options[:class_name] || association_id.to_s).classify 117: foreign_key = options[:foreign_key] 118: primary_key = options[:primary_key] 119: set_associated_class(association_id, klass) 120: 121: opts = { 122: :association_id => association_id, 123: :foreign_key_name => foreign_key, 124: :primary_key_name => primary_key, 125: :wrap => options[:wrap], 126: :extend => options[:extend], 127: } 128: if opts[:wrap] 129: association_class = Association::HasManyWrap 130: else 131: association_class = Association::HasMany 132: primary_key_name = opts[:primary_key_name] 133: foreign_key_name = opts[:foreign_key_name] 134: if primary_key_name != foreign_key_name and 135: primary_key_name != "dn" and 136: !new.have_attribute?(primary_key_name) 137: message = _(":primary_key and :foreign_key has_many options are " \ 138: "inverted their mean since 1.1.0. Please invert them.") 139: ActiveSupport::Deprecation.warn(message) 140: opts[:foreign_key_name] = primary_key_name 141: opts[:primary_key_name] = foreign_key_name 142: end 143: end 144: 145: association_accessor(association_id) do |target| 146: association_class.new(target, opts) 147: end 148: 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 151 151: def association_accessor(name, &make_association) 152: define_method("__make_#{name}") do 153: make_association.call(self) 154: end 155: associations << name 156: association_reader(name, &make_association) 157: association_writer(name, &make_association) 158: end
# File lib/active_ldap/associations.rb, line 160 160: def association_reader(name, &make_association) 161: class_eval("def \#{name}\n@\#{name} ||= __make_\#{name}\nend\n", __FILE__, __LINE__ + 1) 162: end
# File lib/active_ldap/associations.rb, line 169 169: def association_writer(name, &make_association) 170: 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) 171: end
# File lib/active_ldap/associations.rb, line 185 185: def validate_belongs_to_options(options) 186: options.assert_valid_keys(VALID_BELONGS_TO_OPTIONS) 187: end