acts-as-joinable 0.1.7.8 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/app/models/relationship.rb +1 -1
- data/lib/acts-as-joinable.rb +1 -1
- data/lib/acts_as_joinable/core.rb +15 -11
- data/test/test_acts_as_joinable.rb +3 -3
- data/test/test_helper.rb +1 -1
- metadata +4 -6
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
|
|
5
5
|
spec = Gem::Specification.new do |s|
|
6
6
|
s.name = "acts-as-joinable"
|
7
7
|
s.authors = ["Lance Pollard"]
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2"
|
9
9
|
s.summary = "ActsAsJoinable: DRYing up Many-to-Many Relationships in ActiveRecord"
|
10
10
|
s.homepage = "http://github.com/viatropos/acts-as-joinable"
|
11
11
|
s.email = "lancejpollard@gmail.com"
|
data/app/models/relationship.rb
CHANGED
data/lib/acts-as-joinable.rb
CHANGED
@@ -51,7 +51,7 @@ module ActsAsJoinable
|
|
51
51
|
conditions = options[:conditions] || {}
|
52
52
|
conditions["#{relationship.to_s}_type".to_sym] = ([self.name] + (self.send(:subclasses) - self.included_modules).map(&:name)).flatten.uniq
|
53
53
|
group = options[:group] || "#{relationship}_id"
|
54
|
-
|
54
|
+
Relationship.count(:conditions => conditions, :group => group)
|
55
55
|
end
|
56
56
|
|
57
57
|
def acts_as_joinable
|
@@ -78,8 +78,8 @@ module ActsAsJoinable
|
|
78
78
|
|
79
79
|
# parent, child, or contexts (both) for custom helper getters/setters
|
80
80
|
|
81
|
-
has_many :parent_relationships, :class_name => '
|
82
|
-
has_many :child_relationships, :class_name => '
|
81
|
+
has_many :parent_relationships, :class_name => 'Relationship', :as => :child, :foreign_key => "child_id", :uniq => true
|
82
|
+
has_many :child_relationships, :class_name => 'Relationship', :as => :parent, :foreign_key => "parent_id", :uniq => true
|
83
83
|
|
84
84
|
after_destroy :destroy_relationships unless after_destroy.map(&:method).include?(:destroy_relationships)
|
85
85
|
|
@@ -120,7 +120,7 @@ module ActsAsJoinable
|
|
120
120
|
# relationship_table = `relationships`
|
121
121
|
relationship = opposite_for(relationship)
|
122
122
|
through_relationship = "#{relationship.to_s}_#{singular_type}_relationships".to_sym
|
123
|
-
relationship_table =
|
123
|
+
relationship_table = Relationship.quoted_table_name rescue nil
|
124
124
|
|
125
125
|
options.merge!(:through => through_relationship, :source => relationship, :uniq => true)
|
126
126
|
|
@@ -148,7 +148,7 @@ module ActsAsJoinable
|
|
148
148
|
end
|
149
149
|
|
150
150
|
through_options = {
|
151
|
-
:class_name => "
|
151
|
+
:class_name => "Relationship",
|
152
152
|
:conditions => conditions,
|
153
153
|
:as => opposite_for(relationship).to_sym
|
154
154
|
# :select => "#{relationship}_id, #{relationship}_type, id, #{opposite_for(relationship)}_id"
|
@@ -210,7 +210,7 @@ module ActsAsJoinable
|
|
210
210
|
|
211
211
|
def find_joined(model, conditions = {})
|
212
212
|
join_conditions(model, conditions.delete(:relationship) || {}) do |kind, source_type, relationship_conditions|
|
213
|
-
ids =
|
213
|
+
ids = Relationship.select_attributes("#{opposite_for(kind)}_id", relationship_conditions).uniq
|
214
214
|
source_type.all(:conditions => {:id => ids}.merge(conditions))
|
215
215
|
end
|
216
216
|
end
|
@@ -225,7 +225,7 @@ module ActsAsJoinable
|
|
225
225
|
|
226
226
|
def action_from_joined(action, model, conditions)
|
227
227
|
join_conditions(model, conditions.delete(:relationship) || {}) do |kind, source_type, relationship_conditions|
|
228
|
-
ids =
|
228
|
+
ids = Relationship.select_attributes("#{kind}_id", relationship_conditions).uniq.compact.map(&:to_i)
|
229
229
|
send(action, :conditions => {:id => ids}.merge(conditions))
|
230
230
|
end
|
231
231
|
end
|
@@ -294,7 +294,11 @@ module ActsAsJoinable
|
|
294
294
|
end
|
295
295
|
end
|
296
296
|
define_method "#{singular_type}_id" do
|
297
|
-
send(singular_type)
|
297
|
+
if result = send(singular_type)
|
298
|
+
result.respond_to?(:id) ? result.id : nil
|
299
|
+
else
|
300
|
+
nil
|
301
|
+
end
|
298
302
|
end
|
299
303
|
define_method "#{singular_type}_id=" do |id|
|
300
304
|
item = id.blank? ? nil : class_name.constantize.find_by_id(id)
|
@@ -336,11 +340,11 @@ module ActsAsJoinable
|
|
336
340
|
def destroy_relationships
|
337
341
|
#conditions = %Q|(`relationships`.parent_type IN ("#{self.class.name}","#{self.class.base_class.name}") AND `relationships`.parent_id = #{self.id}) OR (`relationships`.child_type IN ("#{self.class.name}","#{self.class.base_class.name}") AND `relationships`.child_id = #{self.id})|
|
338
342
|
classes = [self.class.name, self.class.base_class.name].compact.uniq
|
339
|
-
#relationship_table_name =
|
343
|
+
#relationship_table_name = Relationship.quoted_table_name
|
340
344
|
#conditions = %Q|(#{relationship_table_name}.parent_type IN (#{classes}) AND #{relationship_table_name}.parent_id = #{self.id}) OR (#{relationship_table_name}.child_type IN (#{classes}) AND #{relationship_table_name}.child_id = #{self.id})|
|
341
|
-
#
|
342
|
-
|
343
|
-
|
345
|
+
#Relationship.delete_all(conditions)
|
346
|
+
Relationship.delete_all(:parent_type => classes, :parent_id => self.id)
|
347
|
+
Relationship.delete_all(:child_type => classes, :child_id => self.id)
|
344
348
|
end
|
345
349
|
|
346
350
|
def relationship_matches?(relationship, conditions)
|
@@ -18,7 +18,7 @@ class ActsAsJoinableTest < ActiveRecord::TestCase
|
|
18
18
|
@sub_class.reload
|
19
19
|
@grandparent.reload
|
20
20
|
|
21
|
-
association =
|
21
|
+
association = Relationship.first
|
22
22
|
|
23
23
|
assert @sub_class.valid?
|
24
24
|
assert_equal "SubGroup", association.child_type
|
@@ -67,7 +67,7 @@ class ActsAsJoinableTest < ActiveRecord::TestCase
|
|
67
67
|
end
|
68
68
|
|
69
69
|
should "have optimized sql calls" do
|
70
|
-
|
70
|
+
Relationship.delete_all
|
71
71
|
group = Group.create!
|
72
72
|
group.posts << Post.create!
|
73
73
|
group.posts << Post.create!
|
@@ -82,7 +82,7 @@ class ActsAsJoinableTest < ActiveRecord::TestCase
|
|
82
82
|
group.destroy
|
83
83
|
end
|
84
84
|
|
85
|
-
assert_equal 0,
|
85
|
+
assert_equal 0, Relationship.count
|
86
86
|
end
|
87
87
|
|
88
88
|
context "follow validation conventions" do
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acts-as-joinable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
- 8
|
11
|
-
version: 0.1.7.8
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
12
10
|
platform: ruby
|
13
11
|
authors:
|
14
12
|
- Lance Pollard
|
@@ -16,7 +14,7 @@ autorequire:
|
|
16
14
|
bindir: bin
|
17
15
|
cert_chain: []
|
18
16
|
|
19
|
-
date: 2010-10-
|
17
|
+
date: 2010-10-22 00:00:00 -05:00
|
20
18
|
default_executable:
|
21
19
|
dependencies: []
|
22
20
|
|