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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +251 -3
- data/README.rdoc +1 -1
- data/lib/active_record.rb +1 -0
- data/lib/active_record/advisory_lock_base.rb +18 -0
- data/lib/active_record/aggregations.rb +0 -1
- data/lib/active_record/association_relation.rb +10 -8
- data/lib/active_record/associations.rb +2 -2
- data/lib/active_record/associations/alias_tracker.rb +0 -1
- data/lib/active_record/associations/association.rb +5 -1
- data/lib/active_record/associations/builder/collection_association.rb +2 -2
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +1 -3
- data/lib/active_record/associations/collection_association.rb +6 -2
- data/lib/active_record/associations/collection_proxy.rb +2 -3
- data/lib/active_record/associations/has_many_association.rb +0 -1
- data/lib/active_record/associations/join_dependency.rb +23 -9
- data/lib/active_record/associations/join_dependency/join_association.rb +12 -3
- data/lib/active_record/associations/preloader.rb +2 -3
- data/lib/active_record/associations/preloader/association.rb +3 -1
- data/lib/active_record/attribute_assignment.rb +0 -1
- data/lib/active_record/attribute_decorators.rb +0 -2
- data/lib/active_record/attribute_methods.rb +0 -51
- data/lib/active_record/attribute_methods/before_type_cast.rb +0 -1
- data/lib/active_record/attribute_methods/dirty.rb +8 -3
- data/lib/active_record/attribute_methods/primary_key.rb +0 -2
- data/lib/active_record/attribute_methods/read.rb +0 -1
- data/lib/active_record/attribute_methods/serialization.rb +0 -1
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +0 -2
- data/lib/active_record/attribute_methods/write.rb +0 -1
- data/lib/active_record/attributes.rb +0 -1
- data/lib/active_record/autosave_association.rb +11 -7
- data/lib/active_record/callbacks.rb +1 -2
- data/lib/active_record/coders/yaml_column.rb +0 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +107 -13
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +21 -15
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +5 -5
- data/lib/active_record/connection_adapters/abstract/quoting.rb +53 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +27 -27
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +55 -37
- data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -7
- data/lib/active_record/connection_adapters/abstract_adapter.rb +62 -25
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +25 -32
- data/lib/active_record/connection_adapters/connection_specification.rb +3 -4
- data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +2 -2
- data/lib/active_record/connection_adapters/mysql/column.rb +1 -1
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +8 -12
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +0 -1
- data/lib/active_record/connection_adapters/mysql/quoting.rb +44 -7
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +1 -2
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +3 -1
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +8 -8
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +12 -4
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +9 -3
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +39 -2
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +2 -2
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +15 -29
- data/lib/active_record/connection_adapters/postgresql/utils.rb +0 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +17 -3
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +8 -7
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +38 -3
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +3 -3
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +23 -8
- data/lib/active_record/connection_adapters/statement_pool.rb +0 -1
- data/lib/active_record/connection_handling.rb +17 -22
- data/lib/active_record/core.rb +8 -6
- data/lib/active_record/counter_cache.rb +4 -1
- data/lib/active_record/database_configurations.rb +60 -31
- data/lib/active_record/database_configurations/url_config.rb +0 -1
- data/lib/active_record/dynamic_matchers.rb +2 -3
- data/lib/active_record/enum.rb +9 -0
- data/lib/active_record/explain.rb +0 -1
- data/lib/active_record/fixture_set/table_row.rb +0 -1
- data/lib/active_record/fixture_set/table_rows.rb +0 -1
- data/lib/active_record/fixtures.rb +11 -9
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/inheritance.rb +0 -3
- data/lib/active_record/insert_all.rb +5 -6
- data/lib/active_record/internal_metadata.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +0 -1
- data/lib/active_record/log_subscriber.rb +1 -1
- data/lib/active_record/middleware/database_selector.rb +3 -4
- data/lib/active_record/middleware/database_selector/resolver.rb +5 -8
- data/lib/active_record/migration.rb +43 -32
- data/lib/active_record/migration/command_recorder.rb +6 -18
- data/lib/active_record/migration/compatibility.rb +3 -3
- data/lib/active_record/migration/join_table.rb +0 -1
- data/lib/active_record/model_schema.rb +3 -2
- data/lib/active_record/nested_attributes.rb +0 -2
- data/lib/active_record/no_touching.rb +2 -2
- data/lib/active_record/null_relation.rb +0 -1
- data/lib/active_record/persistence.rb +4 -5
- data/lib/active_record/querying.rb +1 -1
- data/lib/active_record/railtie.rb +1 -2
- data/lib/active_record/railties/collection_cache_association_loading.rb +1 -1
- data/lib/active_record/railties/databases.rake +63 -23
- data/lib/active_record/reflection.rb +9 -9
- data/lib/active_record/relation.rb +13 -1
- data/lib/active_record/relation/batches.rb +0 -1
- data/lib/active_record/relation/calculations.rb +3 -5
- data/lib/active_record/relation/delegation.rb +7 -6
- data/lib/active_record/relation/finder_methods.rb +14 -4
- data/lib/active_record/relation/from_clause.rb +4 -0
- data/lib/active_record/relation/merger.rb +6 -3
- data/lib/active_record/relation/predicate_builder.rb +1 -5
- data/lib/active_record/relation/query_methods.rb +94 -55
- data/lib/active_record/relation/spawn_methods.rb +0 -1
- data/lib/active_record/relation/where_clause.rb +0 -1
- data/lib/active_record/result.rb +0 -1
- data/lib/active_record/sanitization.rb +30 -2
- data/lib/active_record/schema.rb +1 -1
- data/lib/active_record/schema_dumper.rb +5 -1
- data/lib/active_record/schema_migration.rb +1 -1
- data/lib/active_record/scoping.rb +0 -1
- data/lib/active_record/scoping/default.rb +0 -1
- data/lib/active_record/scoping/named.rb +3 -3
- data/lib/active_record/store.rb +1 -1
- data/lib/active_record/suppressor.rb +2 -2
- data/lib/active_record/table_metadata.rb +21 -10
- data/lib/active_record/tasks/database_tasks.rb +76 -8
- data/lib/active_record/tasks/mysql_database_tasks.rb +3 -2
- data/lib/active_record/tasks/postgresql_database_tasks.rb +0 -1
- data/lib/active_record/tasks/sqlite_database_tasks.rb +0 -1
- data/lib/active_record/test_databases.rb +1 -16
- data/lib/active_record/test_fixtures.rb +2 -1
- data/lib/active_record/timestamp.rb +26 -17
- data/lib/active_record/touch_later.rb +3 -2
- data/lib/active_record/transactions.rb +18 -19
- data/lib/active_record/type.rb +0 -1
- data/lib/active_record/type/adapter_specific_registry.rb +2 -5
- data/lib/active_record/type/hash_lookup_type_map.rb +0 -1
- data/lib/active_record/type/serialized.rb +0 -1
- data/lib/active_record/type/type_map.rb +0 -1
- data/lib/active_record/type/unsigned_integer.rb +0 -1
- data/lib/active_record/type_caster/connection.rb +16 -10
- data/lib/active_record/validations.rb +3 -3
- data/lib/active_record/validations/associated.rb +1 -2
- data/lib/arel.rb +17 -6
- data/lib/arel/predications.rb +5 -6
- data/lib/arel/visitors/depth_first.rb +1 -2
- data/lib/arel/visitors/dot.rb +0 -1
- data/lib/arel/visitors/mssql.rb +0 -1
- data/lib/arel/visitors/oracle.rb +1 -2
- data/lib/arel/visitors/oracle12.rb +0 -1
- data/lib/arel/visitors/postgresql.rb +0 -1
- data/lib/arel/visitors/sqlite.rb +0 -1
- data/lib/arel/visitors/to_sql.rb +23 -27
- data/lib/arel/visitors/visitor.rb +9 -6
- data/lib/arel/visitors/where_sql.rb +0 -1
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +0 -1
- data/lib/rails/generators/active_record/migration.rb +0 -1
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +1 -1
- data/lib/rails/generators/active_record/model/model_generator.rb +0 -1
- 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
|
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(
|
313
|
+
def save(*, **) #:nodoc:
|
315
314
|
with_transaction_returning_status { super }
|
316
315
|
end
|
317
316
|
|
318
|
-
def save!(
|
317
|
+
def save!(*, **) #:nodoc:
|
319
318
|
with_transaction_returning_status { super }
|
320
319
|
end
|
321
320
|
|
322
|
-
def touch(
|
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
|
-
|
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
|
-
|
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
|
data/lib/active_record/type.rb
CHANGED
@@ -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
|
@@ -8,21 +8,27 @@ module ActiveRecord
|
|
8
8
|
@table_name = table_name
|
9
9
|
end
|
10
10
|
|
11
|
-
def type_cast_for_database(
|
11
|
+
def type_cast_for_database(attr_name, value)
|
12
12
|
return value if value.is_a?(Arel::Nodes::BindParam)
|
13
|
-
|
14
|
-
|
13
|
+
type = type_for_attribute(attr_name)
|
14
|
+
type.serialize(value)
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
delegate :connection, to: :@klass
|
17
|
+
def type_for_attribute(attr_name)
|
18
|
+
schema_cache = connection.schema_cache
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
data/lib/arel.rb
CHANGED
@@ -24,28 +24,39 @@ require "arel/update_manager"
|
|
24
24
|
require "arel/delete_manager"
|
25
25
|
require "arel/nodes"
|
26
26
|
|
27
|
-
module Arel
|
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
|
-
|
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
|
data/lib/arel/predications.rb
CHANGED
@@ -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
|
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
|
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
|
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
|
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
|
data/lib/arel/visitors/dot.rb
CHANGED
data/lib/arel/visitors/mssql.rb
CHANGED
data/lib/arel/visitors/oracle.rb
CHANGED
@@ -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
|
125
|
+
Nodes::SqlLiteral.new("alias_#{i}__#{' DESC' if /\bdesc$/i.match?(order)}")
|
127
126
|
end
|
128
127
|
o
|
129
128
|
end
|