st-elsewhere 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.1.4
data/lib/st-elsewhere.rb CHANGED
@@ -50,6 +50,10 @@ module StElsewhere
50
50
  association_singular = association_id.to_s.singularize
51
51
  association_plural = association_id.to_s
52
52
  through_association_singular = through.to_s.singularize
53
+ my_class = self
54
+ my_foreign_key = self.to_s.foreign_key
55
+ target_association_class = association_singular.classify.constantize
56
+ target_association_foreign_key = association_singular.foreign_key
53
57
 
54
58
  # Hospital#doctor_ids
55
59
  define_method("#{association_singular}_ids") do
@@ -67,12 +71,14 @@ module StElsewhere
67
71
  # Hospital#doctors=
68
72
  define_method("#{association_plural}=") do |new_associations|
69
73
  through_class = through.to_s.singularize.camelize.constantize
70
- current_associations = self.send("#{association_plural}")
71
- removed_associations = current_associations - new_associations
72
- new_associations = new_associations - current_associations
74
+ current_associations = self.send("#{association_singular}_ids")
75
+ desired_associations = self.class.associations_to_association_ids(new_associations)
73
76
 
74
- self.send("remove_#{association_singular}_associations", through_class, removed_associations)
75
- self.send("add_#{association_singular}_associations", through_class, association_id, new_associations)
77
+ removed_target_associations = current_associations - desired_associations
78
+ new_target_associations = desired_associations - current_associations
79
+
80
+ self.send("remove_#{association_singular}_associations", through_class, removed_target_associations)
81
+ self.send("add_#{association_singular}_associations", through_class, association_id, new_target_associations)
76
82
  end
77
83
 
78
84
  # Hospital#doctor_ids=
@@ -81,19 +87,17 @@ module StElsewhere
81
87
  end
82
88
 
83
89
  # Hospital#remove_doctor_associations (private)
84
- define_method("remove_#{association_singular}_associations") do |association_class, associations|
85
- associations.each do |association|
86
- association_class.delete(association)
87
- end
90
+ define_method("remove_#{association_singular}_associations") do |through_class, removed_target_associations|
91
+ association_instances_to_remove =
92
+ through_class.send("find_all_by_#{my_foreign_key}_and_#{target_association_foreign_key}", self.id, removed_target_associations)
93
+ through_class.delete(association_instances_to_remove)
88
94
  end
89
95
 
90
96
  # Hospital#add_doctor_associations (private)
91
- define_method("add_#{association_singular}_associations") do |through_class, association_id, associations|
92
- myself = self.class.to_s.foreign_key
93
- my_buddy = association_singular.foreign_key
94
- associations.each do |association|
95
- my_buddy_id = Fixnum.eql?(association.class) ? association : association.id
96
- new_association = through_class.new(myself => self.id, my_buddy => my_buddy_id)
97
+ define_method("add_#{association_singular}_associations") do |through_class, association_id, target_association_ids|
98
+ targets_to_add = target_association_class.find(target_association_ids)
99
+ targets_to_add.each do |target_association|
100
+ new_association = through_class.new(my_foreign_key => self.id, target_association_foreign_key => target_association.id)
97
101
  new_association.save
98
102
  end
99
103
  end
@@ -102,6 +106,23 @@ module StElsewhere
102
106
 
103
107
  end
104
108
 
109
+ def associations_to_association_ids(associations)
110
+ ids = []
111
+ if associations && !associations.empty?
112
+ associations.reject!{|a| a.to_s.empty? }
113
+ association_class = associations.first.class.to_s
114
+ ids = case association_class
115
+ when "String"
116
+ associations
117
+ when "Fixnum"
118
+ associations.map{|a| a.to_i }
119
+ else
120
+ associations.map{|a| a.id}
121
+ end
122
+ end
123
+ ids
124
+ end
125
+
105
126
  private :collection_accessor_methods_elsewhere
106
127
 
107
128
  end
data/st-elsewhere.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{st-elsewhere}
8
- s.version = "0.1.3"
8
+ s.version = "0.1.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brian Doll"]
12
- s.date = %q{2009-11-16}
12
+ s.date = %q{2009-11-17}
13
13
  s.description = %q{This gem provides has_many_elsewhere, an ActiveRecord class method to support many to many relationships in Rails applications, across multiple database connections.}
14
14
  s.email = %q{brian@emphaticsolutions.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: st-elsewhere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Doll
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-16 00:00:00 -08:00
12
+ date: 2009-11-17 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15