referrable_joins 0.2.0 → 0.2.1

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.
@@ -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