squeel 1.1.1 → 1.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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rspec +3 -0
- data/.travis.yml +36 -4
- data/CHANGELOG.md +15 -0
- data/Gemfile +1 -1
- data/README.md +47 -6
- data/Rakefile +14 -2
- data/lib/squeel.rb +9 -1
- data/lib/squeel/adapters/active_record.rb +0 -1
- data/lib/squeel/adapters/active_record/3.0/join_dependency_extensions.rb +1 -0
- data/lib/squeel/adapters/active_record/3.0/relation_extensions.rb +12 -1
- data/lib/squeel/adapters/active_record/3.1/join_dependency_extensions.rb +1 -0
- data/lib/squeel/adapters/active_record/3.2/join_dependency_extensions.rb +1 -0
- data/lib/squeel/adapters/active_record/4.0/join_dependency_extensions.rb +1 -0
- data/lib/squeel/adapters/active_record/4.0/relation_extensions.rb +92 -0
- data/lib/squeel/adapters/active_record/4.1/compat.rb +15 -0
- data/lib/squeel/adapters/active_record/4.1/context.rb +88 -0
- data/lib/squeel/adapters/active_record/4.1/preloader_extensions.rb +31 -0
- data/lib/squeel/adapters/active_record/4.1/reflection_extensions.rb +37 -0
- data/lib/squeel/adapters/active_record/4.1/relation_extensions.rb +307 -0
- data/lib/squeel/adapters/active_record/4.2/compat.rb +1 -0
- data/lib/squeel/adapters/active_record/4.2/context.rb +1 -0
- data/lib/squeel/adapters/active_record/4.2/preloader_extensions.rb +1 -0
- data/lib/squeel/adapters/active_record/4.2/relation_extensions.rb +108 -0
- data/lib/squeel/adapters/active_record/context.rb +7 -7
- data/lib/squeel/adapters/active_record/join_dependency_extensions.rb +9 -13
- data/lib/squeel/adapters/active_record/relation_extensions.rb +38 -8
- data/lib/squeel/core_ext/symbol.rb +3 -3
- data/lib/squeel/dsl.rb +1 -1
- data/lib/squeel/nodes.rb +1 -0
- data/lib/squeel/nodes/as.rb +12 -0
- data/lib/squeel/nodes/join.rb +8 -4
- data/lib/squeel/nodes/key_path.rb +10 -1
- data/lib/squeel/nodes/node.rb +21 -0
- data/lib/squeel/nodes/stub.rb +8 -4
- data/lib/squeel/nodes/subquery_join.rb +44 -0
- data/lib/squeel/version.rb +1 -1
- data/lib/squeel/visitors.rb +2 -0
- data/lib/squeel/visitors/enumeration_visitor.rb +101 -0
- data/lib/squeel/visitors/order_visitor.rb +9 -2
- data/lib/squeel/visitors/predicate_visitor.rb +11 -0
- data/lib/squeel/visitors/preload_visitor.rb +12 -0
- data/lib/squeel/visitors/visitor.rb +89 -13
- data/spec/config.travis.yml +13 -0
- data/spec/config.yml +12 -0
- data/spec/console.rb +3 -12
- data/spec/core_ext/symbol_spec.rb +3 -3
- data/spec/helpers/squeel_helper.rb +8 -5
- data/spec/spec_helper.rb +4 -16
- data/spec/squeel/adapters/active_record/context_spec.rb +8 -4
- data/spec/squeel/adapters/active_record/join_dependency_extensions_spec.rb +123 -38
- data/spec/squeel/adapters/active_record/relation_extensions_spec.rb +350 -124
- data/spec/squeel/core_ext/symbol_spec.rb +3 -3
- data/spec/squeel/nodes/join_spec.rb +4 -4
- data/spec/squeel/nodes/stub_spec.rb +3 -3
- data/spec/squeel/nodes/subquery_join_spec.rb +46 -0
- data/spec/squeel/visitors/order_visitor_spec.rb +3 -3
- data/spec/squeel/visitors/predicate_visitor_spec.rb +69 -36
- data/spec/squeel/visitors/select_visitor_spec.rb +1 -1
- data/spec/squeel/visitors/visitor_spec.rb +7 -6
- data/spec/support/models.rb +99 -15
- data/spec/support/schema.rb +109 -4
- data/squeel.gemspec +8 -6
- metadata +89 -107
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/spec/blueprints/articles.rb +0 -5
- data/spec/blueprints/comments.rb +0 -5
- data/spec/blueprints/notes.rb +0 -3
- data/spec/blueprints/people.rb +0 -4
- data/spec/blueprints/tags.rb +0 -3
@@ -11,9 +11,16 @@ module Squeel
|
|
11
11
|
# @param parent The node's parent within the context
|
12
12
|
# @return [Arel::Nodes::Ordering] An ascending or desending ordering
|
13
13
|
def visit_Squeel_Nodes_Order(o, parent)
|
14
|
-
|
14
|
+
if defined?(Arel::Nodes::Descending)
|
15
|
+
if o.descending?
|
16
|
+
Arel::Nodes::Descending.new(visit(o.expr, parent))
|
17
|
+
else
|
18
|
+
Arel::Nodes::Ascending.new(visit(o.expr, parent))
|
19
|
+
end
|
20
|
+
else
|
21
|
+
visit(o.expr, parent).send(o.descending? ? :desc : :asc)
|
22
|
+
end
|
15
23
|
end
|
16
|
-
|
17
24
|
end
|
18
25
|
end
|
19
26
|
end
|
@@ -49,6 +49,16 @@ module Squeel
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
+
def visit_Hash!(o, parent)
|
53
|
+
predicates = super
|
54
|
+
|
55
|
+
if predicates.size > 1
|
56
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::And.new predicates)
|
57
|
+
else
|
58
|
+
predicates.first
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
52
62
|
|
53
63
|
# @return [Boolean] Whether the given value implies a context change
|
54
64
|
# @param v The value to consider
|
@@ -74,6 +84,7 @@ module Squeel
|
|
74
84
|
def visit_without_hash_context_shift(k, v, parent)
|
75
85
|
# Short-circuit for stuff like `where(:author => User.first)`
|
76
86
|
# This filthy hack emulates similar behavior in AR PredicateBuilder
|
87
|
+
|
77
88
|
if ActiveRecord::Base === v &&
|
78
89
|
association = classify(parent).reflect_on_association(k.to_sym)
|
79
90
|
return expand_belongs_to(Nodes::Predicate.new(k, :eq, v), parent, association)
|
@@ -11,6 +11,10 @@ module Squeel
|
|
11
11
|
visit(object, parent)
|
12
12
|
end
|
13
13
|
|
14
|
+
def accept!(object, parent = nil)
|
15
|
+
visit!(object, parent)
|
16
|
+
end
|
17
|
+
|
14
18
|
private
|
15
19
|
|
16
20
|
def visit_Hash(o, parent)
|
@@ -21,6 +25,14 @@ module Squeel
|
|
21
25
|
end
|
22
26
|
end
|
23
27
|
|
28
|
+
def visit_Hash!(o, parent)
|
29
|
+
{}.tap do |hash|
|
30
|
+
o.each do |key, value|
|
31
|
+
hash[visit!(key, parent)] = visit!(value, parent)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
24
36
|
def visit_Symbol(o, parent)
|
25
37
|
o
|
26
38
|
end
|
@@ -6,7 +6,7 @@ module Squeel
|
|
6
6
|
# The Base visitor class, containing the default behavior common to subclasses.
|
7
7
|
class Visitor
|
8
8
|
attr_accessor :context
|
9
|
-
delegate :contextualize, :classify, :find, :traverse, :engine, :arel_visitor, :to => :context
|
9
|
+
delegate :contextualize, :classify, :find, :traverse, :engine, :arel_visitor, :find!, :traverse!, :to => :context
|
10
10
|
|
11
11
|
# Create a new Visitor that uses the supplied context object to contextualize
|
12
12
|
# visited nodes.
|
@@ -27,6 +27,10 @@ module Squeel
|
|
27
27
|
visit(object, parent)
|
28
28
|
end
|
29
29
|
|
30
|
+
def accept!(object, parent = context.base)
|
31
|
+
visit!(object, parent)
|
32
|
+
end
|
33
|
+
|
30
34
|
# @param object The object to check
|
31
35
|
# @return [Boolean] Whether or not the visitor can visit the given object
|
32
36
|
def can_visit?(object)
|
@@ -98,6 +102,21 @@ module Squeel
|
|
98
102
|
@hash_context_depth -= 1
|
99
103
|
end
|
100
104
|
|
105
|
+
def visit_with_hash_context_shift!(k, v, parent)
|
106
|
+
@hash_context_depth += 1
|
107
|
+
|
108
|
+
parent = case k
|
109
|
+
when Nodes::KeyPath
|
110
|
+
traverse!(k, parent, true)
|
111
|
+
else
|
112
|
+
find!(k, parent)
|
113
|
+
end
|
114
|
+
|
115
|
+
can_visit?(v) ? visit!(v, parent || k) : v
|
116
|
+
ensure
|
117
|
+
@hash_context_depth -= 1
|
118
|
+
end
|
119
|
+
|
101
120
|
# If there is no context change, the default behavior is to return the
|
102
121
|
# value unchanged. Subclasses will alter this behavior as needed.
|
103
122
|
#
|
@@ -119,9 +138,11 @@ module Squeel
|
|
119
138
|
# object if not passed as an SqlLiteral.
|
120
139
|
def quoted?(object)
|
121
140
|
case object
|
122
|
-
when
|
141
|
+
when Arel::Nodes::SqlLiteral, Bignum, Fixnum,
|
123
142
|
Arel::SelectManager
|
124
143
|
false
|
144
|
+
when NilClass
|
145
|
+
defined?(Arel::Nodes::Quoted) ? true : false
|
125
146
|
else
|
126
147
|
true
|
127
148
|
end
|
@@ -142,7 +163,11 @@ module Squeel
|
|
142
163
|
when Range
|
143
164
|
Range.new(quote(value.begin), quote(value.end), value.exclude_end?)
|
144
165
|
else
|
145
|
-
Arel
|
166
|
+
if defined?(Arel::Collectors::SQLString)
|
167
|
+
Arel.sql(arel_visitor.compile(Arel::Nodes.build_quoted(value)))
|
168
|
+
else
|
169
|
+
Arel.sql(arel_visitor.accept value)
|
170
|
+
end
|
146
171
|
end
|
147
172
|
else
|
148
173
|
value
|
@@ -166,6 +191,12 @@ module Squeel
|
|
166
191
|
retry
|
167
192
|
end
|
168
193
|
|
194
|
+
def visit!(object, parent)
|
195
|
+
send("#{DISPATCH[object.class]}!", object, parent)
|
196
|
+
rescue NoMethodError => e
|
197
|
+
visit(object, parent)
|
198
|
+
end
|
199
|
+
|
169
200
|
# Pass an object through the visitor unmodified. This is
|
170
201
|
# in order to allow objects that don't require modification
|
171
202
|
# to be handled by Arel directly.
|
@@ -176,6 +207,7 @@ module Squeel
|
|
176
207
|
def visit_passthrough(object, parent)
|
177
208
|
object
|
178
209
|
end
|
210
|
+
|
179
211
|
alias :visit_Fixnum :visit_passthrough
|
180
212
|
alias :visit_Bignum :visit_passthrough
|
181
213
|
|
@@ -189,6 +221,10 @@ module Squeel
|
|
189
221
|
o.map { |v| can_visit?(v) ? visit(v, parent) : v }.flatten
|
190
222
|
end
|
191
223
|
|
224
|
+
def visit_Array!(o, parent)
|
225
|
+
o.map { |v| can_visit?(v) ? visit!(v, parent) : v }.flatten
|
226
|
+
end
|
227
|
+
|
192
228
|
# Visit a Hash. This entails iterating through each key and value and
|
193
229
|
# visiting each value in turn.
|
194
230
|
#
|
@@ -205,6 +241,16 @@ module Squeel
|
|
205
241
|
end.flatten
|
206
242
|
end
|
207
243
|
|
244
|
+
def visit_Hash!(o, parent)
|
245
|
+
o.map do |k, v|
|
246
|
+
if implies_hash_context_shift?(v)
|
247
|
+
visit_with_hash_context_shift!(k, v, parent)
|
248
|
+
else
|
249
|
+
visit_without_hash_context_shift(k, v, parent)
|
250
|
+
end
|
251
|
+
end.flatten
|
252
|
+
end
|
253
|
+
|
208
254
|
# Visit a symbol. This will return an attribute named after the symbol
|
209
255
|
# against the current parent's contextualized table.
|
210
256
|
#
|
@@ -240,6 +286,12 @@ module Squeel
|
|
240
286
|
visit(o.endpoint, parent)
|
241
287
|
end
|
242
288
|
|
289
|
+
def visit_Squeel_Nodes_KeyPath!(o, parent)
|
290
|
+
parent = traverse!(o, parent)
|
291
|
+
|
292
|
+
visit!(o.endpoint, parent)
|
293
|
+
end
|
294
|
+
|
243
295
|
# Visit a Literal by converting it to an Arel SqlLiteral
|
244
296
|
#
|
245
297
|
# @param [Nodes::Literal] o The Literal to visit
|
@@ -255,13 +307,25 @@ module Squeel
|
|
255
307
|
# @param parent The parent object in the context
|
256
308
|
# @return [Arel::Nodes::As] The resulting as node.
|
257
309
|
def visit_Squeel_Nodes_As(o, parent)
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
310
|
+
# patch for 4+, binds params using native to_sql before transforms to sql string
|
311
|
+
if ::ActiveRecord::VERSION::MAJOR >= 4 && o.left.is_a?(::ActiveRecord::Relation)
|
312
|
+
Arel::Nodes::TableAlias.new(
|
313
|
+
Arel::Nodes::Grouping.new(
|
314
|
+
Arel::Nodes::SqlLiteral.new(
|
315
|
+
o.left.respond_to?(:to_sql_with_binding_params) ? o.left.to_sql_with_binding_params : o.left.to_sql
|
316
|
+
)
|
317
|
+
),
|
318
|
+
o.right
|
319
|
+
)
|
263
320
|
else
|
264
|
-
|
321
|
+
left = visit(o.left, parent)
|
322
|
+
# Some nodes, like Arel::SelectManager, have their own #as methods,
|
323
|
+
# with behavior that we don't want to clobber.
|
324
|
+
if left.respond_to?(:as)
|
325
|
+
left.as(o.right)
|
326
|
+
else
|
327
|
+
Arel::Nodes::As.new(left, o.right)
|
328
|
+
end
|
265
329
|
end
|
266
330
|
end
|
267
331
|
|
@@ -313,18 +377,22 @@ module Squeel
|
|
313
377
|
def visit_Squeel_Nodes_Function(o, parent)
|
314
378
|
args = o.args.map do |arg|
|
315
379
|
case arg
|
316
|
-
when Nodes::Function, Nodes::As, Nodes::Literal, Nodes::Grouping, Nodes::KeyPath
|
380
|
+
when Nodes::Function, Nodes::As, Nodes::Literal, Nodes::Grouping, Nodes::KeyPath
|
317
381
|
visit(arg, parent)
|
318
382
|
when ActiveRecord::Relation
|
319
383
|
arg.arel.ast
|
320
384
|
when Symbol, Nodes::Stub
|
321
|
-
|
385
|
+
if defined?(Arel::Collectors::SQLString)
|
386
|
+
Arel.sql(arel_visitor.compile(contextualize(parent)[arg.to_s]))
|
387
|
+
else
|
388
|
+
Arel.sql(arel_visitor.accept(contextualize(parent)[arg.to_s]))
|
389
|
+
end
|
322
390
|
else
|
323
391
|
quote arg
|
324
392
|
end
|
325
393
|
end
|
326
394
|
|
327
|
-
Arel::Nodes::NamedFunction.new(o.function_name, args)
|
395
|
+
Arel::Nodes::NamedFunction.new(o.function_name.to_s, args)
|
328
396
|
end
|
329
397
|
|
330
398
|
# Visit a Squeel operation node, convering it to an Arel InfixOperation
|
@@ -340,7 +408,11 @@ module Squeel
|
|
340
408
|
when Nodes::Function, Nodes::As, Nodes::Literal, Nodes::Grouping, Nodes::KeyPath
|
341
409
|
visit(arg, parent)
|
342
410
|
when Symbol, Nodes::Stub
|
343
|
-
|
411
|
+
if defined?(Arel::Collectors::SQLString)
|
412
|
+
Arel.sql(arel_visitor.compile(contextualize(parent)[arg.to_s]))
|
413
|
+
else
|
414
|
+
Arel.sql(arel_visitor.accept(contextualize(parent)[arg.to_s]))
|
415
|
+
end
|
344
416
|
else
|
345
417
|
quote arg
|
346
418
|
end
|
@@ -381,6 +453,10 @@ module Squeel
|
|
381
453
|
o.id
|
382
454
|
end
|
383
455
|
|
456
|
+
def visit_Arel_Nodes_Node(o, parent)
|
457
|
+
o
|
458
|
+
end
|
459
|
+
|
384
460
|
end
|
385
461
|
end
|
386
462
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
databases:
|
2
|
+
mysql:
|
3
|
+
database: squeel_test_examples
|
4
|
+
username: travis
|
5
|
+
encoding: utf8
|
6
|
+
mysql2:
|
7
|
+
database: squeel_test_examples
|
8
|
+
username: travis
|
9
|
+
encoding: utf8
|
10
|
+
postgresql:
|
11
|
+
database: squeel_test_examples
|
12
|
+
min_messages: warning
|
13
|
+
username: postgres
|
data/spec/config.yml
ADDED
data/spec/console.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
Bundler.setup
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'pp'
|
3
|
+
require 'active_record'
|
4
|
+
require 'active_support'
|
4
5
|
require 'faker'
|
5
6
|
|
6
7
|
Dir[File.expand_path('../helpers/*.rb', __FILE__)].each do |f|
|
@@ -9,16 +10,6 @@ end
|
|
9
10
|
require File.expand_path('../support/schema.rb', __FILE__)
|
10
11
|
require File.expand_path('../support/models.rb', __FILE__)
|
11
12
|
|
12
|
-
Sham.define do
|
13
|
-
name { Faker::Name.name }
|
14
|
-
title { Faker::Lorem.sentence }
|
15
|
-
body { Faker::Lorem.paragraph }
|
16
|
-
salary {|index| 30000 + (index * 1000)}
|
17
|
-
tag_name { Faker::Lorem.words(3).join(' ') }
|
18
|
-
note { Faker::Lorem.words(7).join(' ') }
|
19
|
-
object_name { Faker::Lorem.words(1).first }
|
20
|
-
end
|
21
|
-
|
22
13
|
Models.make
|
23
14
|
|
24
15
|
require 'squeel'
|
@@ -56,13 +56,13 @@ describe Symbol do
|
|
56
56
|
it 'creates inner joins' do
|
57
57
|
join = :join.inner
|
58
58
|
join.should be_a Squeel::Nodes::Join
|
59
|
-
join._type.should eq
|
59
|
+
join._type.should eq Squeel::InnerJoin
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'creates outer joins' do
|
63
63
|
join = :join.outer
|
64
64
|
join.should be_a Squeel::Nodes::Join
|
65
|
-
join._type.should eq
|
65
|
+
join._type.should eq Squeel::OuterJoin
|
66
66
|
end
|
67
67
|
|
68
68
|
it 'creates as nodes' do
|
@@ -72,4 +72,4 @@ describe Symbol do
|
|
72
72
|
as.right.should eq 'other_name'
|
73
73
|
end
|
74
74
|
|
75
|
-
end
|
75
|
+
end
|
@@ -1,4 +1,11 @@
|
|
1
1
|
module SqueelHelper
|
2
|
+
JoinDependency =
|
3
|
+
if defined?(::ActiveRecord::Associations::JoinDependency)
|
4
|
+
::ActiveRecord::Associations::JoinDependency
|
5
|
+
else
|
6
|
+
::ActiveRecord::Associations::ClassMethods::JoinDependency
|
7
|
+
end
|
8
|
+
|
2
9
|
def dsl(&block)
|
3
10
|
Squeel::DSL.eval(&block)
|
4
11
|
end
|
@@ -16,11 +23,7 @@ module SqueelHelper
|
|
16
23
|
end
|
17
24
|
|
18
25
|
def new_join_dependency(*args)
|
19
|
-
|
20
|
-
ActiveRecord::Associations::JoinDependency.new(*args)
|
21
|
-
else
|
22
|
-
ActiveRecord::Associations::ClassMethods::JoinDependency.new(*args)
|
23
|
-
end
|
26
|
+
JoinDependency.new(*args)
|
24
27
|
end
|
25
28
|
|
26
29
|
def activerecord_version_at_least(version_string)
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require 'machinist/active_record'
|
2
|
-
require 'sham'
|
3
1
|
require 'faker'
|
2
|
+
require 'active_record'
|
3
|
+
require 'active_support'
|
4
4
|
|
5
5
|
module ActiveRecord
|
6
6
|
# Shamelessly swiped from the AR test code
|
@@ -21,11 +21,11 @@ module ActiveRecord
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
-
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
24
|
+
::ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
|
25
25
|
end
|
26
26
|
|
27
27
|
unless ENV['DEPRECATIONS']
|
28
|
-
ActiveSupport::Deprecation.silenced = true
|
28
|
+
::ActiveSupport::Deprecation.silenced = true
|
29
29
|
end
|
30
30
|
|
31
31
|
Dir[File.expand_path('../helpers/*.rb', __FILE__)].each do |f|
|
@@ -34,16 +34,6 @@ end
|
|
34
34
|
require File.expand_path('../support/schema.rb', __FILE__)
|
35
35
|
require File.expand_path('../support/models.rb', __FILE__)
|
36
36
|
|
37
|
-
Sham.define do
|
38
|
-
name { Faker::Name.name }
|
39
|
-
title { Faker::Lorem.sentence }
|
40
|
-
body { Faker::Lorem.paragraph }
|
41
|
-
salary {|index| 30000 + (index * 1000)}
|
42
|
-
tag_name { Faker::Lorem.words(3).join(' ') }
|
43
|
-
note { Faker::Lorem.words(7).join(' ') }
|
44
|
-
object_name { Faker::Lorem.words(1).first }
|
45
|
-
end
|
46
|
-
|
47
37
|
RSpec.configure do |config|
|
48
38
|
config.before(:suite) do
|
49
39
|
puts '=' * 80
|
@@ -51,8 +41,6 @@ RSpec.configure do |config|
|
|
51
41
|
puts '=' * 80
|
52
42
|
Models.make
|
53
43
|
end
|
54
|
-
config.before(:all) { Sham.reset(:before_all) }
|
55
|
-
config.before(:each) { Sham.reset(:before_each) }
|
56
44
|
|
57
45
|
config.include SqueelHelper
|
58
46
|
end
|
@@ -16,7 +16,11 @@ module Squeel
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'contextualizes join parts with the proper alias' do
|
19
|
-
table =
|
19
|
+
table = if activerecord_version_at_least('4.1.0')
|
20
|
+
@c.contextualize @jd.join_root.children.last.children.last.children.last.children.last
|
21
|
+
else
|
22
|
+
@c.contextualize @jd.join_associations.last
|
23
|
+
end
|
20
24
|
table.table_alias.should eq 'parents_people_2'
|
21
25
|
end
|
22
26
|
|
@@ -27,13 +31,13 @@ module Squeel
|
|
27
31
|
end
|
28
32
|
|
29
33
|
it 'contextualizes polymorphic Join nodes to the arel_table of their klass' do
|
30
|
-
table = @c.contextualize Nodes::Join.new(:notable,
|
34
|
+
table = @c.contextualize Nodes::Join.new(:notable, Squeel::InnerJoin, Article)
|
31
35
|
table.name.should eq 'articles'
|
32
36
|
table.table_alias.should be_nil
|
33
37
|
end
|
34
38
|
|
35
39
|
it 'contextualizes non-polymorphic Join nodes to the table for their name' do
|
36
|
-
table = @c.contextualize Nodes::Join.new(:notes,
|
40
|
+
table = @c.contextualize Nodes::Join.new(:notes, Squeel::InnerJoin)
|
37
41
|
table.name.should eq 'notes'
|
38
42
|
table.table_alias.should be_nil
|
39
43
|
end
|
@@ -41,4 +45,4 @@ module Squeel
|
|
41
45
|
end
|
42
46
|
end
|
43
47
|
end
|
44
|
-
end
|
48
|
+
end
|