activerecord 6.0.0.rc1 → 6.0.3.rc1

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.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +251 -3
  3. data/README.rdoc +1 -1
  4. data/lib/active_record.rb +1 -0
  5. data/lib/active_record/advisory_lock_base.rb +18 -0
  6. data/lib/active_record/aggregations.rb +0 -1
  7. data/lib/active_record/association_relation.rb +10 -8
  8. data/lib/active_record/associations.rb +2 -2
  9. data/lib/active_record/associations/alias_tracker.rb +0 -1
  10. data/lib/active_record/associations/association.rb +5 -1
  11. data/lib/active_record/associations/builder/collection_association.rb +2 -2
  12. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -3
  13. data/lib/active_record/associations/collection_association.rb +6 -2
  14. data/lib/active_record/associations/collection_proxy.rb +2 -3
  15. data/lib/active_record/associations/has_many_association.rb +0 -1
  16. data/lib/active_record/associations/join_dependency.rb +23 -9
  17. data/lib/active_record/associations/join_dependency/join_association.rb +12 -3
  18. data/lib/active_record/associations/preloader.rb +2 -3
  19. data/lib/active_record/associations/preloader/association.rb +3 -1
  20. data/lib/active_record/attribute_assignment.rb +0 -1
  21. data/lib/active_record/attribute_decorators.rb +0 -2
  22. data/lib/active_record/attribute_methods.rb +0 -51
  23. data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
  24. data/lib/active_record/attribute_methods/dirty.rb +8 -3
  25. data/lib/active_record/attribute_methods/primary_key.rb +0 -2
  26. data/lib/active_record/attribute_methods/read.rb +0 -1
  27. data/lib/active_record/attribute_methods/serialization.rb +0 -1
  28. data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
  29. data/lib/active_record/attribute_methods/write.rb +0 -1
  30. data/lib/active_record/attributes.rb +0 -1
  31. data/lib/active_record/autosave_association.rb +11 -7
  32. data/lib/active_record/callbacks.rb +1 -2
  33. data/lib/active_record/coders/yaml_column.rb +0 -1
  34. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +107 -13
  35. data/lib/active_record/connection_adapters/abstract/database_statements.rb +21 -15
  36. data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -5
  37. data/lib/active_record/connection_adapters/abstract/quoting.rb +53 -0
  38. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
  39. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
  40. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +55 -37
  42. data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -7
  43. data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -25
  44. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +25 -32
  45. data/lib/active_record/connection_adapters/connection_specification.rb +3 -4
  46. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -2
  47. data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
  48. data/lib/active_record/connection_adapters/mysql/database_statements.rb +8 -12
  49. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
  50. data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
  51. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
  52. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +3 -1
  53. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
  54. data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -4
  55. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -3
  56. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
  57. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
  58. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
  59. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
  60. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  61. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
  62. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
  63. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
  64. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
  65. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
  66. data/lib/active_record/connection_adapters/postgresql/quoting.rb +39 -2
  67. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
  68. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
  69. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
  70. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
  71. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
  72. data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
  73. data/lib/active_record/connection_adapters/postgresql_adapter.rb +17 -3
  74. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +8 -7
  75. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -3
  76. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
  77. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +23 -8
  78. data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
  79. data/lib/active_record/connection_handling.rb +17 -22
  80. data/lib/active_record/core.rb +8 -6
  81. data/lib/active_record/counter_cache.rb +4 -1
  82. data/lib/active_record/database_configurations.rb +60 -31
  83. data/lib/active_record/database_configurations/url_config.rb +0 -1
  84. data/lib/active_record/dynamic_matchers.rb +2 -3
  85. data/lib/active_record/enum.rb +9 -0
  86. data/lib/active_record/explain.rb +0 -1
  87. data/lib/active_record/fixture_set/table_row.rb +0 -1
  88. data/lib/active_record/fixture_set/table_rows.rb +0 -1
  89. data/lib/active_record/fixtures.rb +11 -9
  90. data/lib/active_record/gem_version.rb +1 -1
  91. data/lib/active_record/inheritance.rb +0 -3
  92. data/lib/active_record/insert_all.rb +5 -6
  93. data/lib/active_record/internal_metadata.rb +1 -1
  94. data/lib/active_record/locking/optimistic.rb +0 -1
  95. data/lib/active_record/log_subscriber.rb +1 -1
  96. data/lib/active_record/middleware/database_selector.rb +3 -4
  97. data/lib/active_record/middleware/database_selector/resolver.rb +5 -8
  98. data/lib/active_record/migration.rb +43 -32
  99. data/lib/active_record/migration/command_recorder.rb +6 -18
  100. data/lib/active_record/migration/compatibility.rb +3 -3
  101. data/lib/active_record/migration/join_table.rb +0 -1
  102. data/lib/active_record/model_schema.rb +3 -2
  103. data/lib/active_record/nested_attributes.rb +0 -2
  104. data/lib/active_record/no_touching.rb +2 -2
  105. data/lib/active_record/null_relation.rb +0 -1
  106. data/lib/active_record/persistence.rb +4 -5
  107. data/lib/active_record/querying.rb +1 -1
  108. data/lib/active_record/railtie.rb +1 -2
  109. data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
  110. data/lib/active_record/railties/databases.rake +63 -23
  111. data/lib/active_record/reflection.rb +9 -9
  112. data/lib/active_record/relation.rb +13 -1
  113. data/lib/active_record/relation/batches.rb +0 -1
  114. data/lib/active_record/relation/calculations.rb +3 -5
  115. data/lib/active_record/relation/delegation.rb +7 -6
  116. data/lib/active_record/relation/finder_methods.rb +14 -4
  117. data/lib/active_record/relation/from_clause.rb +4 -0
  118. data/lib/active_record/relation/merger.rb +6 -3
  119. data/lib/active_record/relation/predicate_builder.rb +1 -5
  120. data/lib/active_record/relation/query_methods.rb +94 -55
  121. data/lib/active_record/relation/spawn_methods.rb +0 -1
  122. data/lib/active_record/relation/where_clause.rb +0 -1
  123. data/lib/active_record/result.rb +0 -1
  124. data/lib/active_record/sanitization.rb +30 -2
  125. data/lib/active_record/schema.rb +1 -1
  126. data/lib/active_record/schema_dumper.rb +5 -1
  127. data/lib/active_record/schema_migration.rb +1 -1
  128. data/lib/active_record/scoping.rb +0 -1
  129. data/lib/active_record/scoping/default.rb +0 -1
  130. data/lib/active_record/scoping/named.rb +3 -3
  131. data/lib/active_record/store.rb +1 -1
  132. data/lib/active_record/suppressor.rb +2 -2
  133. data/lib/active_record/table_metadata.rb +21 -10
  134. data/lib/active_record/tasks/database_tasks.rb +76 -8
  135. data/lib/active_record/tasks/mysql_database_tasks.rb +3 -2
  136. data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
  137. data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
  138. data/lib/active_record/test_databases.rb +1 -16
  139. data/lib/active_record/test_fixtures.rb +2 -1
  140. data/lib/active_record/timestamp.rb +26 -17
  141. data/lib/active_record/touch_later.rb +3 -2
  142. data/lib/active_record/transactions.rb +18 -19
  143. data/lib/active_record/type.rb +0 -1
  144. data/lib/active_record/type/adapter_specific_registry.rb +2 -5
  145. data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
  146. data/lib/active_record/type/serialized.rb +0 -1
  147. data/lib/active_record/type/type_map.rb +0 -1
  148. data/lib/active_record/type/unsigned_integer.rb +0 -1
  149. data/lib/active_record/type_caster/connection.rb +16 -10
  150. data/lib/active_record/validations.rb +3 -3
  151. data/lib/active_record/validations/associated.rb +1 -2
  152. data/lib/arel.rb +17 -6
  153. data/lib/arel/predications.rb +5 -6
  154. data/lib/arel/visitors/depth_first.rb +1 -2
  155. data/lib/arel/visitors/dot.rb +0 -1
  156. data/lib/arel/visitors/mssql.rb +0 -1
  157. data/lib/arel/visitors/oracle.rb +1 -2
  158. data/lib/arel/visitors/oracle12.rb +0 -1
  159. data/lib/arel/visitors/postgresql.rb +0 -1
  160. data/lib/arel/visitors/sqlite.rb +0 -1
  161. data/lib/arel/visitors/to_sql.rb +23 -27
  162. data/lib/arel/visitors/visitor.rb +9 -6
  163. data/lib/arel/visitors/where_sql.rb +0 -1
  164. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
  165. data/lib/rails/generators/active_record/migration.rb +0 -1
  166. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
  167. data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
  168. metadata +13 -9
@@ -9,7 +9,7 @@ module ActiveRecord
9
9
  before_commit_without_transaction_enrollment :touch_deferred_attributes
10
10
  end
11
11
 
12
- def touch_later(*names) # :nodoc:
12
+ def touch_later(*names, **) # :nodoc:
13
13
  unless persisted?
14
14
  raise ActiveRecordError, <<-MSG.squish
15
15
  cannot touch on a new or destroyed record object. Consider using
@@ -23,6 +23,7 @@ module ActiveRecord
23
23
 
24
24
  surreptitiously_touch @_defer_touch_attrs
25
25
  add_to_transaction
26
+ @_new_record_before_last_commit ||= false
26
27
 
27
28
  # touch the parents as we are not calling the after_save callbacks
28
29
  self.class.reflect_on_all_associations(:belongs_to).each do |r|
@@ -40,7 +41,6 @@ module ActiveRecord
40
41
  end
41
42
 
42
43
  private
43
-
44
44
  def surreptitiously_touch(attrs)
45
45
  attrs.each { |attr| write_attribute attr, @_touch_time }
46
46
  clear_attribute_changes attrs
@@ -48,6 +48,7 @@ module ActiveRecord
48
48
 
49
49
  def touch_deferred_attributes
50
50
  if has_defer_touch_attrs? && persisted?
51
+ @_skip_dirty_tracking = true
51
52
  touch(*@_defer_touch_attrs, time: @_touch_time)
52
53
  @_defer_touch_attrs, @_touch_time = nil, nil
53
54
  end
@@ -208,8 +208,8 @@ module ActiveRecord
208
208
  # Note that "TRUNCATE" is also a MySQL DDL statement!
209
209
  module ClassMethods
210
210
  # See the ConnectionAdapters::DatabaseStatements#transaction API docs.
211
- def transaction(options = {}, &block)
212
- connection.transaction(options, &block)
211
+ def transaction(**options, &block)
212
+ connection.transaction(**options, &block)
213
213
  end
214
214
 
215
215
  def before_commit(*args, &block) # :nodoc:
@@ -282,7 +282,6 @@ module ActiveRecord
282
282
  end
283
283
 
284
284
  private
285
-
286
285
  def set_options_for_callbacks!(args, enforced_options = {})
287
286
  options = args.extract_options!.merge!(enforced_options)
288
287
  args << options
@@ -304,22 +303,22 @@ module ActiveRecord
304
303
 
305
304
  # See ActiveRecord::Transactions::ClassMethods for detailed documentation.
306
305
  def transaction(options = {}, &block)
307
- self.class.transaction(options, &block)
306
+ self.class.transaction(**options, &block)
308
307
  end
309
308
 
310
309
  def destroy #:nodoc:
311
310
  with_transaction_returning_status { super }
312
311
  end
313
312
 
314
- def save(*) #:nodoc:
313
+ def save(*, **) #:nodoc:
315
314
  with_transaction_returning_status { super }
316
315
  end
317
316
 
318
- def save!(*) #:nodoc:
317
+ def save!(*, **) #:nodoc:
319
318
  with_transaction_returning_status { super }
320
319
  end
321
320
 
322
- def touch(*) #:nodoc:
321
+ def touch(*, **) #:nodoc:
323
322
  with_transaction_returning_status { super }
324
323
  end
325
324
 
@@ -333,14 +332,14 @@ module ActiveRecord
333
332
  # Ensure that it is not called if the object was never persisted (failed create),
334
333
  # but call it after the commit of a destroyed object.
335
334
  def committed!(should_run_callbacks: true) #:nodoc:
336
- if should_run_callbacks && (destroyed? || persisted?)
335
+ force_clear_transaction_record_state
336
+ if should_run_callbacks
337
337
  @_committed_already_called = true
338
338
  _run_commit_without_transaction_enrollment_callbacks
339
339
  _run_commit_callbacks
340
340
  end
341
341
  ensure
342
- @_committed_already_called = false
343
- force_clear_transaction_record_state
342
+ @_committed_already_called = @_trigger_update_callback = @_trigger_destroy_callback = false
344
343
  end
345
344
 
346
345
  # Call the #after_rollback callbacks. The +force_restore_state+ argument indicates if the record
@@ -353,6 +352,7 @@ module ActiveRecord
353
352
  ensure
354
353
  restore_transaction_record_state(force_restore_state)
355
354
  clear_transaction_record_state
355
+ @_trigger_update_callback = @_trigger_destroy_callback = false if force_restore_state
356
356
  end
357
357
 
358
358
  # Executes +method+ within a transaction and captures its return value as a
@@ -364,7 +364,9 @@ module ActiveRecord
364
364
  def with_transaction_returning_status
365
365
  status = nil
366
366
  self.class.transaction do
367
- unless has_transactional_callbacks?
367
+ if has_transactional_callbacks?
368
+ add_to_transaction
369
+ else
368
370
  sync_with_transaction_state if @transaction_state&.finalized?
369
371
  @transaction_state = self.class.connection.transaction_state
370
372
  end
@@ -372,15 +374,15 @@ module ActiveRecord
372
374
 
373
375
  status = yield
374
376
  raise ActiveRecord::Rollback unless status
375
- ensure
376
- if has_transactional_callbacks? &&
377
- (@_new_record_before_last_commit && !new_record? || _trigger_update_callback || _trigger_destroy_callback)
378
- add_to_transaction
379
- end
380
377
  end
381
378
  status
382
379
  end
383
380
 
381
+ def trigger_transactional_callbacks? # :nodoc:
382
+ (@_new_record_before_last_commit || _trigger_update_callback) && persisted? ||
383
+ _trigger_destroy_callback && destroyed?
384
+ end
385
+
384
386
  private
385
387
  attr_reader :_committed_already_called, :_trigger_update_callback, :_trigger_destroy_callback
386
388
 
@@ -395,10 +397,7 @@ module ActiveRecord
395
397
  level: 0
396
398
  }
397
399
  @_start_transaction_state[:level] += 1
398
- remember_new_record_before_last_commit
399
- end
400
400
 
401
- def remember_new_record_before_last_commit
402
401
  if _committed_already_called
403
402
  @_new_record_before_last_commit = false
404
403
  else
@@ -47,7 +47,6 @@ module ActiveRecord
47
47
  end
48
48
 
49
49
  private
50
-
51
50
  def current_adapter_name
52
51
  ActiveRecord::Base.connection.adapter_name.downcase.to_sym
53
52
  end
@@ -11,14 +11,13 @@ module ActiveRecord
11
11
  end
12
12
 
13
13
  private
14
-
15
14
  def registration_klass
16
15
  Registration
17
16
  end
18
17
 
19
- def find_registration(symbol, *args)
18
+ def find_registration(symbol, *args, **kwargs)
20
19
  registrations
21
- .select { |registration| registration.matches?(symbol, *args) }
20
+ .select { |registration| registration.matches?(symbol, *args, **kwargs) }
22
21
  .max
23
22
  end
24
23
  end
@@ -53,7 +52,6 @@ module ActiveRecord
53
52
  end
54
53
 
55
54
  protected
56
-
57
55
  attr_reader :name, :block, :adapter, :override
58
56
 
59
57
  def priority
@@ -72,7 +70,6 @@ module ActiveRecord
72
70
  end
73
71
 
74
72
  private
75
-
76
73
  def matches_adapter?(adapter: nil, **)
77
74
  (self.adapter.nil? || adapter == self.adapter)
78
75
  end
@@ -16,7 +16,6 @@ module ActiveRecord
16
16
  end
17
17
 
18
18
  private
19
-
20
19
  def perform_fetch(type, *args, &block)
21
20
  @mapping.fetch(type, block).call(type, *args)
22
21
  end
@@ -56,7 +56,6 @@ module ActiveRecord
56
56
  end
57
57
 
58
58
  private
59
-
60
59
  def default_value?(value)
61
60
  value == coder.load(nil)
62
61
  end
@@ -45,7 +45,6 @@ module ActiveRecord
45
45
  end
46
46
 
47
47
  private
48
-
49
48
  def perform_fetch(lookup_key, *args)
50
49
  matching_pair = @mapping.reverse_each.detect do |key, _|
51
50
  key === lookup_key
@@ -4,7 +4,6 @@ module ActiveRecord
4
4
  module Type
5
5
  class UnsignedInteger < ActiveModel::Type::Integer # :nodoc:
6
6
  private
7
-
8
7
  def max_value
9
8
  super * 2
10
9
  end
@@ -8,21 +8,27 @@ module ActiveRecord
8
8
  @table_name = table_name
9
9
  end
10
10
 
11
- def type_cast_for_database(attribute_name, value)
11
+ def type_cast_for_database(attr_name, value)
12
12
  return value if value.is_a?(Arel::Nodes::BindParam)
13
- column = column_for(attribute_name)
14
- connection.type_cast_from_column(column, value)
13
+ type = type_for_attribute(attr_name)
14
+ type.serialize(value)
15
15
  end
16
16
 
17
- private
18
- attr_reader :table_name
19
- delegate :connection, to: :@klass
17
+ def type_for_attribute(attr_name)
18
+ schema_cache = connection.schema_cache
20
19
 
21
- def column_for(attribute_name)
22
- if connection.schema_cache.data_source_exists?(table_name)
23
- connection.schema_cache.columns_hash(table_name)[attribute_name.to_s]
24
- end
20
+ if schema_cache.data_source_exists?(table_name)
21
+ column = schema_cache.columns_hash(table_name)[attr_name.to_s]
22
+ type = connection.lookup_cast_type_from_column(column) if column
25
23
  end
24
+
25
+ type || Type.default_value
26
+ end
27
+
28
+ delegate :connection, to: :@klass, private: true
29
+
30
+ private
31
+ attr_reader :table_name
26
32
  end
27
33
  end
28
34
  end
@@ -40,15 +40,16 @@ module ActiveRecord
40
40
  include ActiveModel::Validations
41
41
 
42
42
  # The validation process on save can be skipped by passing <tt>validate: false</tt>.
43
+ # The validation context can be changed by passing <tt>context: context</tt>.
43
44
  # The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#save] method is replaced
44
45
  # with this when the validations module is mixed in, which it is by default.
45
- def save(options = {})
46
+ def save(**options)
46
47
  perform_validations(options) ? super : false
47
48
  end
48
49
 
49
50
  # Attempts to save the record just like {ActiveRecord::Base#save}[rdoc-ref:Base#save] but
50
51
  # will raise an ActiveRecord::RecordInvalid exception instead of returning +false+ if the record is not valid.
51
- def save!(options = {})
52
+ def save!(**options)
52
53
  perform_validations(options) ? super : raise_validation_error
53
54
  end
54
55
 
@@ -71,7 +72,6 @@ module ActiveRecord
71
72
  alias_method :validate, :valid?
72
73
 
73
74
  private
74
-
75
75
  def default_validation_context
76
76
  new_record? ? :create : :update
77
77
  end
@@ -5,12 +5,11 @@ module ActiveRecord
5
5
  class AssociatedValidator < ActiveModel::EachValidator #:nodoc:
6
6
  def validate_each(record, attribute, value)
7
7
  if Array(value).reject { |r| valid_object?(r) }.any?
8
- record.errors.add(attribute, :invalid, options.merge(value: value))
8
+ record.errors.add(attribute, :invalid, **options.merge(value: value))
9
9
  end
10
10
  end
11
11
 
12
12
  private
13
-
14
13
  def valid_object?(record)
15
14
  (record.respond_to?(:marked_for_destruction?) && record.marked_for_destruction?) || record.valid?
16
15
  end
@@ -24,28 +24,39 @@ require "arel/update_manager"
24
24
  require "arel/delete_manager"
25
25
  require "arel/nodes"
26
26
 
27
- module Arel # :nodoc: all
27
+ module Arel
28
28
  VERSION = "10.0.0"
29
29
 
30
+ # Wrap a known-safe SQL string for passing to query methods, e.g.
31
+ #
32
+ # Post.order(Arel.sql("length(title)")).last
33
+ #
34
+ # Great caution should be taken to avoid SQL injection vulnerabilities.
35
+ # This method should not be used with unsafe values such as request
36
+ # parameters or model attributes.
30
37
  def self.sql(raw_sql)
31
38
  Arel::Nodes::SqlLiteral.new raw_sql
32
39
  end
33
40
 
34
- def self.star
41
+ def self.star # :nodoc:
35
42
  sql "*"
36
43
  end
37
44
 
38
- def self.arel_node?(value)
45
+ def self.arel_node?(value) # :nodoc:
39
46
  value.is_a?(Arel::Node) || value.is_a?(Arel::Attribute) || value.is_a?(Arel::Nodes::SqlLiteral)
40
47
  end
41
48
 
42
- def self.fetch_attribute(value)
49
+ def self.fetch_attribute(value) # :nodoc:
43
50
  case value
44
51
  when Arel::Nodes::Between, Arel::Nodes::In, Arel::Nodes::NotIn, Arel::Nodes::Equality, Arel::Nodes::NotEqual, Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual, Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
45
- yield value.left.is_a?(Arel::Attributes::Attribute) ? value.left : value.right
52
+ if value.left.is_a?(Arel::Attributes::Attribute)
53
+ yield value.left
54
+ elsif value.right.is_a?(Arel::Attributes::Attribute)
55
+ yield value.right
56
+ end
46
57
  end
47
58
  end
48
59
 
49
60
  ## Convenience Alias
50
- Node = Arel::Nodes::Node
61
+ Node = Arel::Nodes::Node # :nodoc:
51
62
  end
@@ -38,14 +38,14 @@ module Arel # :nodoc: all
38
38
  if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
39
39
  self.in([])
40
40
  elsif open_ended?(other.begin)
41
- if other.end.nil? || open_ended?(other.end)
41
+ if open_ended?(other.end)
42
42
  not_in([])
43
43
  elsif other.exclude_end?
44
44
  lt(other.end)
45
45
  else
46
46
  lteq(other.end)
47
47
  end
48
- elsif other.end.nil? || open_ended?(other.end)
48
+ elsif open_ended?(other.end)
49
49
  gteq(other.begin)
50
50
  elsif other.exclude_end?
51
51
  gteq(other.begin).and(lt(other.end))
@@ -86,14 +86,14 @@ Passing a range to `#in` is deprecated. Call `#between`, instead.
86
86
  if unboundable?(other.begin) == 1 || unboundable?(other.end) == -1
87
87
  not_in([])
88
88
  elsif open_ended?(other.begin)
89
- if other.end.nil? || open_ended?(other.end)
89
+ if open_ended?(other.end)
90
90
  self.in([])
91
91
  elsif other.exclude_end?
92
92
  gteq(other.end)
93
93
  else
94
94
  gt(other.end)
95
95
  end
96
- elsif other.end.nil? || open_ended?(other.end)
96
+ elsif open_ended?(other.end)
97
97
  lt(other.begin)
98
98
  else
99
99
  left = lt(other.begin)
@@ -221,7 +221,6 @@ Passing a range to `#not_in` is deprecated. Call `#not_between`, instead.
221
221
  end
222
222
 
223
223
  private
224
-
225
224
  def grouping_any(method_id, others, *extras)
226
225
  nodes = others.map { |expr| send(method_id, expr, *extras) }
227
226
  Nodes::Grouping.new nodes.inject { |memo, node|
@@ -251,7 +250,7 @@ Passing a range to `#not_in` is deprecated. Call `#not_between`, instead.
251
250
  end
252
251
 
253
252
  def open_ended?(value)
254
- infinity?(value) || unboundable?(value)
253
+ value.nil? || infinity?(value) || unboundable?(value)
255
254
  end
256
255
  end
257
256
  end
@@ -9,8 +9,7 @@ module Arel # :nodoc: all
9
9
  end
10
10
 
11
11
  private
12
-
13
- def visit(o)
12
+ def visit(o, _ = nil)
14
13
  super
15
14
  @block.call o
16
15
  end
@@ -31,7 +31,6 @@ module Arel # :nodoc: all
31
31
  end
32
32
 
33
33
  private
34
-
35
34
  def visit_Arel_Nodes_Ordering(o)
36
35
  visit_edge o, "expr"
37
36
  end
@@ -11,7 +11,6 @@ module Arel # :nodoc: all
11
11
  end
12
12
 
13
13
  private
14
-
15
14
  def visit_Arel_Nodes_IsNotDistinctFrom(o, collector)
16
15
  right = o.right
17
16
 
@@ -4,7 +4,6 @@ module Arel # :nodoc: all
4
4
  module Visitors
5
5
  class Oracle < Arel::Visitors::ToSql
6
6
  private
7
-
8
7
  def visit_Arel_Nodes_SelectStatement(o, collector)
9
8
  o = order_hacks(o)
10
9
 
@@ -123,7 +122,7 @@ module Arel # :nodoc: all
123
122
  o.orders = []
124
123
  orders.each_with_index do |order, i|
125
124
  o.orders <<
126
- Nodes::SqlLiteral.new("alias_#{i}__#{' DESC' if /\bdesc$/i === order}")
125
+ Nodes::SqlLiteral.new("alias_#{i}__#{' DESC' if /\bdesc$/i.match?(order)}")
127
126
  end
128
127
  o
129
128
  end
@@ -4,7 +4,6 @@ module Arel # :nodoc: all
4
4
  module Visitors
5
5
  class Oracle12 < Arel::Visitors::ToSql
6
6
  private
7
-
8
7
  def visit_Arel_Nodes_SelectStatement(o, collector)
9
8
  # Oracle does not allow LIMIT clause with select for update
10
9
  if o.limit && o.lock