referrable_joins 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,72 @@
1
1
  module ActiveRecord
2
+
3
+ module SpawnMethods
4
+ def merge(r)
5
+ merged_relation = clone
6
+ return merged_relation unless r
7
+ return to_a & r if r.is_a?(Array)
8
+
9
+ Relation::ASSOCIATION_METHODS.each do |method|
10
+ value = r.send(:"#{method}_values")
11
+
12
+ unless value.empty?
13
+ if method == :includes
14
+ merged_relation = merged_relation.includes(value)
15
+ else
16
+ merged_relation.send(:"#{method}_values=", value)
17
+ end
18
+ end
19
+ end
20
+
21
+ (Relation::MULTI_VALUE_METHODS - [:joins, :where, :order]).each do |method|
22
+ value = r.send(:"#{method}_values")
23
+ merged_relation.send(:"#{method}_values=", merged_relation.send(:"#{method}_values") + value) if value.present?
24
+ end
25
+
26
+ order_value = r.order_values
27
+ if order_value.present?
28
+ if r.reorder_flag
29
+ merged_relation.order_values = order_value
30
+ else
31
+ merged_relation.order_values = merged_relation.order_values + order_value
32
+ end
33
+ end
34
+
35
+ # MONKEYPATCH Only change, right here.
36
+ merged_relation = merged_relation.outer_joins(r.outer_joins_values).inner_join(r.inner_joins_values)
37
+
38
+ merged_wheres = @where_values + r.where_values
39
+
40
+ unless @where_values.empty?
41
+ # Remove duplicates, last one wins.
42
+ seen = Hash.new { |h,table| h[table] = {} }
43
+ merged_wheres = merged_wheres.reverse.reject { |w|
44
+ nuke = false
45
+ if w.respond_to?(:operator) && w.operator == :==
46
+ name = w.left.name
47
+ table = w.left.relation.name
48
+ nuke = seen[table][name]
49
+ seen[table][name] = true
50
+ end
51
+ nuke
52
+ }.reverse
53
+ end
54
+
55
+ merged_relation.where_values = merged_wheres
56
+
57
+ Relation::SINGLE_VALUE_METHODS.reject {|m| m == :lock}.each do |method|
58
+ value = r.send(:"#{method}_value")
59
+ merged_relation.send(:"#{method}_value=", value) unless value.nil?
60
+ end
61
+
62
+ merged_relation.lock_value = r.lock_value unless merged_relation.lock_value
63
+
64
+ # Apply scope extension modules
65
+ merged_relation.send :apply_modules, r.extensions
66
+
67
+ merged_relation
68
+ end
69
+ end
2
70
 
3
71
  class ReflectionTable
4
72
 
@@ -31,7 +99,7 @@ module ActiveRecord
31
99
  delegate :outer_joins, :inner_joins, :to => :scoped
32
100
 
33
101
  def reflection_table(reflection)
34
- ActiveRecord::ReflectionTable.new(self.reflections[reflection].table_name.to_sym)
102
+ ActiveRecord::ReflectionTable.new(self.reflections[reflection].table_name.to_sym, reflection)
35
103
  end
36
104
 
37
105
  end
@@ -1,3 +1,3 @@
1
1
  module ReferrableJoins
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: referrable_joins
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 0
10
- version: 0.2.0
9
+ - 1
10
+ version: 0.2.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Burke Libbey
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-03 00:00:00 -05:00
18
+ date: 2011-04-04 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies: []
21
21