Skip to content
This repository was archived by the owner on Nov 15, 2018. It is now read-only.

Commit acfbebb

Browse files
author
koutou
committed
* fix has_many association is broken [#35]
Patch by culturespy. Thanks!!! git-svn-id: http://ruby-activeldap.googlecode.com/svn/trunk@1107 fd4f1387-ac19-0410-9179-05984c98faae
1 parent d9d5a67 commit acfbebb

File tree

8 files changed

+59
-24
lines changed

8 files changed

+59
-24
lines changed

README

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ list, please point out.
114114
* Lennon Day-Reynolds: Bug reports.
115115
* Tilo: A bug report.
116116
* Matt Mencel: A bug report.
117-
* CultureSpy: A bug report.
117+
* CultureSpy:
118+
* Bug reports.
119+
* Bug fixes.
118120
* gwarf12: A bug report.
119121
* Baptiste Grenier: API improvement ideas.
120122
* Richard 3 Nicholas: API improvement ideas.

lib/active_ldap/association/has_many.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ class HasMany < Collection
88

99
private
1010
def insert_entry(entry)
11-
entry[@options[:foreign_key_name]] = @owner[primary_key]
11+
entry[foreign_key] = @owner[primary_key]
1212
entry.save
1313
end
1414

1515
def find_target
16-
collect_targets(:primary_key_name)
16+
collect_targets(primary_key)
1717
end
1818

1919
def delete_entries(entries)
20-
key = @options[:foreign_key_name]
20+
_foreign_key = foreign_key
2121
components = @owner[primary_key, true].reject do |value|
2222
value.nil?
2323
end
2424
filter = [:and,
25-
[:and, {key => components}],
25+
[:and, {_foreign_key => components}],
2626
[:or, {foreign_class.dn_attribute => entries.collect(&:id)}]]
27-
foreign_class.update_all({key => []}, filter)
27+
foreign_class.update_all({_foreign_key => []}, filter)
2828
end
2929
end
3030
end

lib/active_ldap/association/has_many_utils.rb

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ module Association
33
module HasManyUtils
44
private
55
def collect_targets(requested_target_key, need_requested_targets=false)
6-
foreign_base_key = primary_key
7-
return [] if foreign_base_key.nil?
8-
9-
requested_targets = @owner[@options[requested_target_key], true]
6+
_foreign_key = foreign_key
7+
return [] if _foreign_key.nil?
108

9+
requested_targets = @owner[requested_target_key, true]
1110
requested_targets = requested_targets.reject(&:nil?)
1211
if requested_targets.empty?
1312
targets = []
14-
elsif foreign_base_key == "dn"
13+
elsif _foreign_key == "dn"
1514
requested_targets = requested_targets.collect do |target|
1615
if target.is_a?(DN)
1716
target
@@ -28,7 +27,7 @@ def collect_targets(requested_target_key, need_requested_targets=false)
2827
end
2928
else
3029
components = requested_targets.collect do |value|
31-
[foreign_base_key, value]
30+
[_foreign_key, value]
3231
end
3332
options = find_options(:filter => [:or, *components])
3433
targets = foreign_class.find(:all, options)

lib/active_ldap/association/has_many_wrap.rb

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ class HasManyWrap < Collection
99
private
1010
def insert_entry(entry)
1111
old_value = @owner[@options[:wrap], true]
12-
_primary_key = primary_key
13-
if _primary_key == "dn"
12+
_foreign_key = foreign_key
13+
if _foreign_key == "dn"
1414
old_value = dn_values_to_string_values(old_value)
1515
end
16-
current_value = entry[_primary_key, true]
16+
current_value = entry[_foreign_key, true]
1717
current_value = dn_values_to_string_values(current_value)
1818
new_value = (old_value + current_value).uniq.sort
1919
if old_value != new_value
@@ -24,11 +24,11 @@ def insert_entry(entry)
2424

2525
def delete_entries(entries)
2626
old_value = @owner[@options[:wrap], true]
27-
_primary_key = primary_key
28-
if _primary_key == "dn"
27+
_foreign_key = foreign_key
28+
if _foreign_key == "dn"
2929
old_value = dn_values_to_string_values(old_value)
3030
end
31-
current_value = entries.collect {|entry| entry[_primary_key]}
31+
current_value = entries.collect {|entry| entry[_foreign_key]}
3232
current_value = dn_values_to_string_values(current_value)
3333
new_value = old_value - current_value
3434
new_value = new_value.uniq.sort
@@ -39,20 +39,24 @@ def delete_entries(entries)
3939
end
4040

4141
def find_target
42-
targets, requested_targets = collect_targets(:wrap, true)
42+
targets, requested_targets = collect_targets(@options[:wrap], true)
4343
return [] if targets.nil?
4444

4545
found_targets = {}
46-
foreign_base_key = primary_key
46+
_foreign_key = foreign_key
4747
targets.each do |target|
48-
found_targets[target[foreign_base_key]] ||= target
48+
found_targets[target[_foreign_key]] ||= target
4949
end
5050

5151
klass = foreign_class
5252
requested_targets.collect do |name|
5353
found_targets[name] || klass.new(name)
5454
end
5555
end
56+
57+
def foreign_key
58+
@options[:primary_key_name] || foreign_class.dn_attribute
59+
end
5660
end
5761
end
5862
end

lib/active_ldap/association/proxy.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ def have_foreign_key?
7070
end
7171

7272
def primary_key
73-
@options[:primary_key_name] || foreign_class.dn_attribute
73+
@options[:primary_key_name] || @owner.dn_attribute
74+
end
75+
76+
def foreign_key
77+
@options[:foreign_key_name] || foreign_class.dn_attribute
7478
end
7579

7680
def load_target

lib/active_ldap/associations.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,13 +125,13 @@ def has_many(association_id, options = {})
125125
:extend => options[:extend],
126126
}
127127
if opts[:wrap]
128-
opts[:foreign_key_name] ||= "#{association_id}_id"
129128
association_class = Association::HasManyWrap
130129
else
131130
association_class = Association::HasMany
132131
primary_key_name = opts[:primary_key_name]
133132
foreign_key_name = opts[:foreign_key_name]
134133
if primary_key_name != foreign_key_name and
134+
primary_key_name != "dn" and
135135
!new.have_attribute?(primary_key_name)
136136
message = _(":primary_key and :foreign_key has_many options are " \
137137
"inverted their mean since 1.1.0. Please invert them.")

test/al-test-utils.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ def make_temporary_user(config={})
289289
uid_number = config[:uid_number] || default_uid
290290
gid_number = config[:gid_number] || default_gid
291291
home_directory = config[:home_directory] || "/nonexistent"
292+
see_also = config[:see_also]
292293
_wrap_assertion do
293294
assert(!@user_class.exists?(uid))
294295
assert_raise(ActiveLdap::EntryNotFound) do
@@ -302,6 +303,7 @@ def make_temporary_user(config={})
302303
user.gid_number = gid_number
303304
user.home_directory = home_directory
304305
user.user_password = ActiveLdap::UserPassword.ssha(password)
306+
user.see_also = see_also
305307
unless config[:simple]
306308
user.add_class('shadowAccount', 'inetOrgPerson',
307309
'organizationalPerson')

test/test_associations.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,31 @@ class TestAssociations < Test::Unit::TestCase
44
include AlTestUtils
55

66
priority :must
7+
def test_has_many_of_self
8+
@user_class.has_many(:references,
9+
:class_name => "User",
10+
:primary_key => "dn",
11+
:foreign_key => "seeAlso")
12+
@user_class.set_associated_class(:references, @user_class)
13+
make_temporary_user do |user1, password1|
14+
make_temporary_user(:see_also => user1.dn.to_s) do |user2, password2|
15+
make_temporary_user(:see_also => user2.dn.to_s) do |user3, password3|
16+
make_temporary_user(:see_also => user2.dn.to_s) do |user4, password4|
17+
make_temporary_user(:see_also => user1.dn.to_s) do |user5, password5|
18+
user1_references = user1.references.collect {|r| r.dn.to_s}
19+
user2_references = user2.references.collect {|r| r.dn.to_s}
20+
user1_expected_references = [user2, user5].collect {|r| r.dn.to_s}
21+
user2_expected_references = [user3, user4].collect {|r| r.dn.to_s}
22+
assert_equal(user1_expected_references, user1_references)
23+
assert_equal(user2_expected_references, user2_references)
24+
end
25+
end
26+
end
27+
end
28+
end
29+
end
30+
31+
priority :normal
732
def test_belongs_to_add_with_string
833
make_temporary_user do |user,|
934
make_temporary_group do |group1|
@@ -25,7 +50,6 @@ def test_belongs_to_add_with_string
2550
end
2651
end
2752

28-
priority :normal
2953
def test_has_many_delete_required_attribute
3054
make_temporary_group do |group|
3155
make_temporary_user do |user,|

0 commit comments

Comments
 (0)