| Module | ActiveLdap::Associations::ClassMethods |
| In: |
lib/active_ldap/associations.rb
|
| VALID_BELONGS_TO_OPTIONS | = | [:class, :foreign_key, :primary_key, :many, :extend] |
| VALID_HAS_MANY_OPTIONS | = | [:class, :foreign_key, :primary_key, :wrap, :extend] |
# File lib/active_ldap/associations.rb, line 24
24: def associated_class(name)
25: @associated_classes[name.to_s]
26: 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 43
43: def belongs_to(association_id, options={})
44: validate_belongs_to_options(options)
45: klass = options[:class] || Inflector.classify(association_id)
46: foreign_key = options[:foreign_key]
47: primary_key = options[:primary_key]
48: many = options[:many]
49: set_associated_class(association_id, klass)
50:
51: opts = {
52: :association_id => association_id,
53: :foreign_key_name => foreign_key,
54: :primary_key_name => primary_key,
55: :many => many,
56: :extend => options[:extend],
57: }
58: if opts[:many]
59: association_class = Association::BelongsToMany
60: opts[:foreign_key_name] ||= dn_attribute
61: else
62: association_class = Association::BelongsTo
63: opts[:foreign_key_name] ||= "#{association_id}_id"
64:
65: 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")
66: end
67:
68: association_accessor(association_id) do |target|
69: association_class.new(target, opts)
70: end
71: 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 96
96: def has_many(association_id, options = {})
97: validate_has_many_options(options)
98: klass = options[:class] || Inflector.classify(association_id)
99: foreign_key = options[:foreign_key] || association_id.to_s + "_id"
100: primary_key = options[:primary_key]
101: set_associated_class(association_id, klass)
102:
103: opts = {
104: :association_id => association_id,
105: :foreign_key_name => foreign_key,
106: :primary_key_name => primary_key,
107: :wrap => options[:wrap],
108: :extend => options[:extend],
109: }
110: if opts[:wrap]
111: association_class = Association::HasManyWrap
112: else
113: association_class = Association::HasMany
114: end
115:
116: association_accessor(association_id) do |target|
117: association_class.new(target, opts)
118: end
119: end
# File lib/active_ldap/associations.rb, line 19
19: def set_associated_class(name, klass)
20: @associated_classes ||= {}
21: @associated_classes[name.to_s] = klass
22: end
# File lib/active_ldap/associations.rb, line 122
122: def association_accessor(name, &make_association)
123: define_method("__make_#{name}") do
124: make_association.call(self)
125: end
126: association_reader(name, &make_association)
127: association_writer(name, &make_association)
128: end
# File lib/active_ldap/associations.rb, line 130
130: def association_reader(name, &make_association)
131: class_eval("def \#{name}\n@\#{name} ||= __make_\#{name}\nend\n", __FILE__, __LINE__ + 1)
132: end
# File lib/active_ldap/associations.rb, line 139
139: def association_writer(name, &make_association)
140: 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)
141: end
# File lib/active_ldap/associations.rb, line 154
154: def validate_belongs_to_options(options)
155: options.assert_valid_keys(VALID_BELONGS_TO_OPTIONS)
156: end