activerecord 8.0.0.beta1 → 8.0.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +67 -0
- data/lib/active_record/associations/has_many_through_association.rb +7 -1
- data/lib/active_record/attribute_methods/primary_key.rb +2 -7
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +2 -12
- data/lib/active_record/callbacks.rb +1 -1
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +26 -8
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +4 -5
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +6 -1
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +8 -2
- data/lib/active_record/connection_adapters/abstract_adapter.rb +0 -1
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +8 -4
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +2 -4
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +0 -10
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +1 -11
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +4 -8
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +8 -8
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +1 -1
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +0 -2
- data/lib/active_record/connection_adapters.rb +0 -56
- data/lib/active_record/core.rb +14 -11
- data/lib/active_record/enum.rb +54 -72
- data/lib/active_record/fixtures.rb +0 -1
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +1 -1
- data/lib/active_record/log_subscriber.rb +5 -11
- data/lib/active_record/marshalling.rb +4 -1
- data/lib/active_record/migration.rb +0 -5
- data/lib/active_record/model_schema.rb +2 -3
- data/lib/active_record/query_cache.rb +0 -4
- data/lib/active_record/query_logs.rb +5 -11
- data/lib/active_record/querying.rb +2 -2
- data/lib/active_record/railtie.rb +1 -24
- data/lib/active_record/railties/databases.rake +1 -1
- data/lib/active_record/reflection.rb +14 -19
- data/lib/active_record/relation/calculations.rb +24 -28
- data/lib/active_record/relation/predicate_builder.rb +8 -0
- data/lib/active_record/relation/query_methods.rb +66 -36
- data/lib/active_record/relation.rb +8 -1
- data/lib/active_record/result.rb +10 -9
- data/lib/active_record/table_metadata.rb +1 -3
- data/lib/active_record/tasks/database_tasks.rb +4 -31
- data/lib/active_record/testing/query_assertions.rb +2 -2
- data/lib/active_record.rb +0 -45
- data/lib/arel/table.rb +3 -7
- data/lib/arel/visitors/sqlite.rb +25 -0
- metadata +9 -10
- data/lib/active_record/relation/record_fetch_warning.rb +0 -52
@@ -506,7 +506,7 @@ module ActiveRecord
|
|
506
506
|
#
|
507
507
|
# Post.with_recursive(post_and_replies: [Post.where(id: 42), Post.joins('JOIN post_and_replies ON posts.in_reply_to_id = post_and_replies.id')])
|
508
508
|
# # => ActiveRecord::Relation
|
509
|
-
# # WITH post_and_replies AS (
|
509
|
+
# # WITH RECURSIVE post_and_replies AS (
|
510
510
|
# # (SELECT * FROM posts WHERE id = 42)
|
511
511
|
# # UNION ALL
|
512
512
|
# # (SELECT * FROM posts JOIN posts_and_replies ON posts.in_reply_to_id = posts_and_replies.id)
|
@@ -1656,6 +1656,22 @@ module ActiveRecord
|
|
1656
1656
|
self
|
1657
1657
|
end
|
1658
1658
|
|
1659
|
+
protected
|
1660
|
+
def arel_columns(columns)
|
1661
|
+
columns.flat_map do |field|
|
1662
|
+
case field
|
1663
|
+
when Symbol, String
|
1664
|
+
arel_column(field)
|
1665
|
+
when Proc
|
1666
|
+
field.call
|
1667
|
+
when Hash
|
1668
|
+
arel_columns_from_hash(field)
|
1669
|
+
else
|
1670
|
+
field
|
1671
|
+
end
|
1672
|
+
end
|
1673
|
+
end
|
1674
|
+
|
1659
1675
|
private
|
1660
1676
|
def async
|
1661
1677
|
spawn.async!
|
@@ -1910,12 +1926,26 @@ module ActiveRecord
|
|
1910
1926
|
end
|
1911
1927
|
end
|
1912
1928
|
|
1913
|
-
def build_with_expression_from_value(value)
|
1929
|
+
def build_with_expression_from_value(value, nested = false)
|
1914
1930
|
case value
|
1915
1931
|
when Arel::Nodes::SqlLiteral then Arel::Nodes::Grouping.new(value)
|
1916
|
-
when ActiveRecord::Relation
|
1932
|
+
when ActiveRecord::Relation
|
1933
|
+
if nested
|
1934
|
+
value.arel.ast
|
1935
|
+
else
|
1936
|
+
value.arel
|
1937
|
+
end
|
1917
1938
|
when Arel::SelectManager then value
|
1918
|
-
when Array
|
1939
|
+
when Array
|
1940
|
+
return build_with_expression_from_value(value.first, false) if value.size == 1
|
1941
|
+
|
1942
|
+
parts = value.map do |query|
|
1943
|
+
build_with_expression_from_value(query, true)
|
1944
|
+
end
|
1945
|
+
|
1946
|
+
parts.reduce do |result, value|
|
1947
|
+
Arel::Nodes::UnionAll.new(result, value)
|
1948
|
+
end
|
1919
1949
|
else
|
1920
1950
|
raise ArgumentError, "Unsupported argument type: `#{value}` #{value.class}"
|
1921
1951
|
end
|
@@ -1929,38 +1959,43 @@ module ActiveRecord
|
|
1929
1959
|
).join_sources.first
|
1930
1960
|
end
|
1931
1961
|
|
1932
|
-
def
|
1933
|
-
|
1934
|
-
|
1935
|
-
|
1936
|
-
|
1937
|
-
|
1962
|
+
def arel_columns_from_hash(fields)
|
1963
|
+
fields.flat_map do |table_name, columns|
|
1964
|
+
table_name = table_name.name if table_name.is_a?(Symbol)
|
1965
|
+
case columns
|
1966
|
+
when Symbol, String
|
1967
|
+
arel_column_with_table(table_name, columns.to_s)
|
1968
|
+
when Array
|
1969
|
+
columns.map do |column|
|
1970
|
+
arel_column_with_table(table_name, column.to_s)
|
1938
1971
|
end
|
1939
|
-
when String
|
1940
|
-
arel_column(field, &:itself)
|
1941
|
-
when Proc
|
1942
|
-
field.call
|
1943
|
-
when Hash
|
1944
|
-
arel_columns_from_hash(field)
|
1945
1972
|
else
|
1946
|
-
|
1973
|
+
raise TypeError, "Expected Symbol, String or Array, got: #{columns.class}"
|
1947
1974
|
end
|
1948
1975
|
end
|
1949
1976
|
end
|
1950
1977
|
|
1978
|
+
def arel_column_with_table(table_name, column_name)
|
1979
|
+
self.references_values |= [Arel.sql(table_name, retryable: true)]
|
1980
|
+
predicate_builder.resolve_arel_attribute(table_name, column_name) do
|
1981
|
+
lookup_table_klass_from_join_dependencies(table_name)
|
1982
|
+
end
|
1983
|
+
end
|
1984
|
+
|
1951
1985
|
def arel_column(field)
|
1986
|
+
field = field.name if is_symbol = field.is_a?(Symbol)
|
1987
|
+
|
1952
1988
|
field = model.attribute_aliases[field] || field
|
1953
1989
|
from = from_clause.name || from_clause.value
|
1954
1990
|
|
1955
1991
|
if model.columns_hash.key?(field) && (!from || table_name_matches?(from))
|
1956
1992
|
table[field]
|
1957
|
-
elsif
|
1958
|
-
table, column
|
1959
|
-
|
1960
|
-
lookup_table_klass_from_join_dependencies(table)
|
1961
|
-
end
|
1962
|
-
else
|
1993
|
+
elsif /\A(?<table>(?:\w+\.)?\w+)\.(?<column>\w+)\z/ =~ field
|
1994
|
+
arel_column_with_table(table, column)
|
1995
|
+
elsif block_given?
|
1963
1996
|
yield field
|
1997
|
+
else
|
1998
|
+
Arel.sql(is_symbol ? model.adapter_class.quote_table_name(field) : field)
|
1964
1999
|
end
|
1965
2000
|
end
|
1966
2001
|
|
@@ -2182,34 +2217,29 @@ module ActiveRecord
|
|
2182
2217
|
def process_select_args(fields)
|
2183
2218
|
fields.flat_map do |field|
|
2184
2219
|
if field.is_a?(Hash)
|
2185
|
-
|
2220
|
+
arel_column_aliases_from_hash(field)
|
2186
2221
|
else
|
2187
2222
|
field
|
2188
2223
|
end
|
2189
2224
|
end
|
2190
2225
|
end
|
2191
2226
|
|
2192
|
-
def
|
2227
|
+
def arel_column_aliases_from_hash(fields)
|
2193
2228
|
fields.flat_map do |key, columns_aliases|
|
2229
|
+
table_name = key.is_a?(Symbol) ? key.name : key
|
2194
2230
|
case columns_aliases
|
2195
2231
|
when Hash
|
2196
2232
|
columns_aliases.map do |column, column_alias|
|
2197
|
-
|
2198
|
-
|
2199
|
-
self.references_values |= references unless references.empty?
|
2200
|
-
end
|
2201
|
-
arel_column("#{key}.#{column}") do
|
2202
|
-
predicate_builder.resolve_arel_attribute(key.to_s, column)
|
2203
|
-
end.as(column_alias.to_s)
|
2233
|
+
arel_column_with_table(table_name, column.to_s)
|
2234
|
+
.as(model.adapter_class.quote_column_name(column_alias.to_s))
|
2204
2235
|
end
|
2205
2236
|
when Array
|
2206
2237
|
columns_aliases.map do |column|
|
2207
|
-
|
2238
|
+
arel_column_with_table(table_name, column.to_s)
|
2208
2239
|
end
|
2209
2240
|
when String, Symbol
|
2210
|
-
arel_column(key
|
2211
|
-
|
2212
|
-
end.as(columns_aliases.to_s)
|
2241
|
+
arel_column(key)
|
2242
|
+
.as(model.adapter_class.quote_column_name(columns_aliases.to_s))
|
2213
2243
|
end
|
2214
2244
|
end
|
2215
2245
|
end
|
@@ -74,7 +74,14 @@ module ActiveRecord
|
|
74
74
|
alias :loaded? :loaded
|
75
75
|
alias :locked? :lock_value
|
76
76
|
|
77
|
-
def initialize(model, table:
|
77
|
+
def initialize(model, table: nil, predicate_builder: nil, values: {})
|
78
|
+
if table
|
79
|
+
predicate_builder ||= model.predicate_builder.with(TableMetadata.new(model, table))
|
80
|
+
else
|
81
|
+
table = model.arel_table
|
82
|
+
predicate_builder ||= model.predicate_builder
|
83
|
+
end
|
84
|
+
|
78
85
|
@model = model
|
79
86
|
@table = table
|
80
87
|
@values = values
|
data/lib/active_record/result.rb
CHANGED
@@ -127,9 +127,9 @@ module ActiveRecord
|
|
127
127
|
# Returns an +Enumerator+ if no block is given.
|
128
128
|
def each(&block)
|
129
129
|
if block_given?
|
130
|
-
|
130
|
+
hash_rows.each(&block)
|
131
131
|
else
|
132
|
-
|
132
|
+
hash_rows.to_enum { @rows.size }
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
@@ -191,6 +191,7 @@ module ActiveRecord
|
|
191
191
|
def initialize_copy(other)
|
192
192
|
@rows = rows.dup
|
193
193
|
@column_types = column_types.dup
|
194
|
+
@hash_rows = nil
|
194
195
|
end
|
195
196
|
|
196
197
|
def freeze # :nodoc:
|
@@ -212,6 +213,13 @@ module ActiveRecord
|
|
212
213
|
end
|
213
214
|
end
|
214
215
|
|
216
|
+
def indexed_rows # :nodoc:
|
217
|
+
@indexed_rows ||= begin
|
218
|
+
columns = column_indexes
|
219
|
+
@rows.map { |row| IndexedRow.new(columns, row) }.freeze
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
215
223
|
private
|
216
224
|
def column_type(name, index, type_overrides)
|
217
225
|
type_overrides.fetch(name) do
|
@@ -221,13 +229,6 @@ module ActiveRecord
|
|
221
229
|
end
|
222
230
|
end
|
223
231
|
|
224
|
-
def indexed_rows
|
225
|
-
@indexed_rows ||= begin
|
226
|
-
columns = column_indexes
|
227
|
-
@rows.map { |row| IndexedRow.new(columns, row) }.freeze
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
232
|
def hash_rows
|
232
233
|
# We use transform_values to rows.
|
233
234
|
# This is faster because we avoid any reallocs and avoid hashing entirely.
|
@@ -69,9 +69,7 @@ module ActiveRecord
|
|
69
69
|
|
70
70
|
def predicate_builder
|
71
71
|
if klass
|
72
|
-
|
73
|
-
predicate_builder.instance_variable_set(:@table, self)
|
74
|
-
predicate_builder
|
72
|
+
klass.predicate_builder.with(self)
|
75
73
|
else
|
76
74
|
PredicateBuilder.new(self)
|
77
75
|
end
|
@@ -446,26 +446,10 @@ module ActiveRecord
|
|
446
446
|
end
|
447
447
|
end
|
448
448
|
|
449
|
-
def cache_dump_filename(
|
450
|
-
|
451
|
-
schema_cache_path ||
|
452
|
-
|
453
|
-
schema_cache_env ||
|
454
|
-
db_config_or_name.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
|
455
|
-
else
|
456
|
-
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
457
|
-
Passing a database name to `cache_dump_filename` is deprecated and will be removed in Rails 8.0. Pass a
|
458
|
-
`ActiveRecord::DatabaseConfigurations::DatabaseConfig` object instead.
|
459
|
-
MSG
|
460
|
-
|
461
|
-
filename = if ActiveRecord::Base.configurations.primary?(db_config_or_name)
|
462
|
-
"schema_cache.yml"
|
463
|
-
else
|
464
|
-
"#{db_config_or_name}_schema_cache.yml"
|
465
|
-
end
|
466
|
-
|
467
|
-
schema_cache_path || schema_cache_env || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, filename)
|
468
|
-
end
|
449
|
+
def cache_dump_filename(db_config, schema_cache_path: nil)
|
450
|
+
schema_cache_path ||
|
451
|
+
db_config.schema_cache_path ||
|
452
|
+
db_config.default_schema_cache_path(ActiveRecord::Tasks::DatabaseTasks.db_dir)
|
469
453
|
end
|
470
454
|
|
471
455
|
def load_schema_current(format = ActiveRecord.schema_format, file = nil, environment = env)
|
@@ -536,17 +520,6 @@ module ActiveRecord
|
|
536
520
|
end
|
537
521
|
|
538
522
|
private
|
539
|
-
def schema_cache_env
|
540
|
-
if ENV["SCHEMA_CACHE"]
|
541
|
-
ActiveRecord.deprecator.warn(<<~MSG.squish)
|
542
|
-
Setting `ENV["SCHEMA_CACHE"]` is deprecated and will be removed in Rails 8.0.
|
543
|
-
Configure the `:schema_cache_path` in the database configuration instead.
|
544
|
-
MSG
|
545
|
-
|
546
|
-
nil
|
547
|
-
end
|
548
|
-
end
|
549
|
-
|
550
523
|
def with_temporary_pool(db_config, clobber: false)
|
551
524
|
original_db_config = migration_class.connection_db_config
|
552
525
|
pool = migration_class.connection_handler.establish_connection(db_config, clobber: clobber)
|
@@ -52,7 +52,7 @@ module ActiveRecord
|
|
52
52
|
# assert_queries_match(/LIMIT \?/) { Post.first }
|
53
53
|
#
|
54
54
|
# If the +:include_schema+ option is provided, any queries (including schema related)
|
55
|
-
#
|
55
|
+
# that match the matcher are considered.
|
56
56
|
#
|
57
57
|
# assert_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
|
58
58
|
#
|
@@ -80,7 +80,7 @@ module ActiveRecord
|
|
80
80
|
# assert_no_queries_match(/SELECT/i) { post.comments }
|
81
81
|
#
|
82
82
|
# If the +:include_schema+ option is provided, any queries (including schema related)
|
83
|
-
#
|
83
|
+
# that match the matcher are counted.
|
84
84
|
#
|
85
85
|
# assert_no_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
|
86
86
|
#
|
data/lib/active_record.rb
CHANGED
@@ -268,14 +268,6 @@ module ActiveRecord
|
|
268
268
|
singleton_class.attr_accessor :reading_role
|
269
269
|
self.reading_role = :reading
|
270
270
|
|
271
|
-
def self.legacy_connection_handling=(_)
|
272
|
-
raise ArgumentError, <<~MSG.squish
|
273
|
-
The `legacy_connection_handling` setter was deprecated in 7.0 and removed in 7.1,
|
274
|
-
but is still defined in your configuration. Please remove this call as it no longer
|
275
|
-
has any effect."
|
276
|
-
MSG
|
277
|
-
end
|
278
|
-
|
279
271
|
##
|
280
272
|
# :singleton-method: async_query_executor
|
281
273
|
# Sets the async_query_executor for an application. By default the thread pool executor
|
@@ -359,29 +351,6 @@ module ActiveRecord
|
|
359
351
|
singleton_class.attr_accessor :run_after_transaction_callbacks_in_order_defined
|
360
352
|
self.run_after_transaction_callbacks_in_order_defined = false
|
361
353
|
|
362
|
-
def self.commit_transaction_on_non_local_return
|
363
|
-
ActiveRecord.deprecator.warn <<-WARNING.squish
|
364
|
-
`Rails.application.config.active_record.commit_transaction_on_non_local_return`
|
365
|
-
is deprecated and will be removed in Rails 8.0.
|
366
|
-
WARNING
|
367
|
-
end
|
368
|
-
|
369
|
-
def self.commit_transaction_on_non_local_return=(value)
|
370
|
-
ActiveRecord.deprecator.warn <<-WARNING.squish
|
371
|
-
`Rails.application.config.active_record.commit_transaction_on_non_local_return`
|
372
|
-
is deprecated and will be removed in Rails 8.0.
|
373
|
-
WARNING
|
374
|
-
end
|
375
|
-
|
376
|
-
##
|
377
|
-
# :singleton-method: warn_on_records_fetched_greater_than
|
378
|
-
# Specify a threshold for the size of query result sets. If the number of
|
379
|
-
# records in the set exceeds the threshold, a warning is logged. This can
|
380
|
-
# be used to identify queries which load thousands of records and
|
381
|
-
# potentially cause memory bloat.
|
382
|
-
singleton_class.attr_accessor :warn_on_records_fetched_greater_than
|
383
|
-
self.warn_on_records_fetched_greater_than = false
|
384
|
-
|
385
354
|
singleton_class.attr_accessor :application_record_class
|
386
355
|
self.application_record_class = nil
|
387
356
|
|
@@ -459,20 +428,6 @@ module ActiveRecord
|
|
459
428
|
singleton_class.attr_accessor :verify_foreign_keys_for_fixtures
|
460
429
|
self.verify_foreign_keys_for_fixtures = false
|
461
430
|
|
462
|
-
def self.allow_deprecated_singular_associations_name
|
463
|
-
ActiveRecord.deprecator.warn <<-WARNING.squish
|
464
|
-
`Rails.application.config.active_record.allow_deprecated_singular_associations_name`
|
465
|
-
is deprecated and will be removed in Rails 8.0.
|
466
|
-
WARNING
|
467
|
-
end
|
468
|
-
|
469
|
-
def self.allow_deprecated_singular_associations_name=(value)
|
470
|
-
ActiveRecord.deprecator.warn <<-WARNING.squish
|
471
|
-
`Rails.application.config.active_record.allow_deprecated_singular_associations_name`
|
472
|
-
is deprecated and will be removed in Rails 8.0.
|
473
|
-
WARNING
|
474
|
-
end
|
475
|
-
|
476
431
|
singleton_class.attr_accessor :query_transformers
|
477
432
|
self.query_transformers = []
|
478
433
|
|
data/lib/arel/table.rb
CHANGED
@@ -12,13 +12,9 @@ module Arel # :nodoc: all
|
|
12
12
|
attr_reader :table_alias
|
13
13
|
|
14
14
|
def initialize(name, as: nil, klass: nil, type_caster: klass&.type_caster)
|
15
|
-
|
16
|
-
case name
|
17
|
-
when Symbol then name.to_s
|
18
|
-
else
|
19
|
-
name
|
20
|
-
end
|
15
|
+
name = name.name if name.is_a?(Symbol)
|
21
16
|
|
17
|
+
@name = name
|
22
18
|
@klass = klass
|
23
19
|
@type_caster = type_caster
|
24
20
|
|
@@ -84,7 +80,7 @@ module Arel # :nodoc: all
|
|
84
80
|
end
|
85
81
|
|
86
82
|
def [](name, table = self)
|
87
|
-
name = name.
|
83
|
+
name = name.name if name.is_a?(Symbol)
|
88
84
|
name = @klass.attribute_aliases[name] || name if @klass
|
89
85
|
Attribute.new(table, name)
|
90
86
|
end
|
data/lib/arel/visitors/sqlite.rb
CHANGED
@@ -33,6 +33,31 @@ module Arel # :nodoc: all
|
|
33
33
|
collector << " IS NOT "
|
34
34
|
visit o.right, collector
|
35
35
|
end
|
36
|
+
|
37
|
+
# Queries used in UNION should not be wrapped by parentheses,
|
38
|
+
# because it is an invalid syntax in SQLite.
|
39
|
+
def infix_value_with_paren(o, collector, value, suppress_parens = false)
|
40
|
+
collector << "( " unless suppress_parens
|
41
|
+
|
42
|
+
left = o.left.is_a?(Nodes::Grouping) ? o.left.expr : o.left
|
43
|
+
collector = if left.class == o.class
|
44
|
+
infix_value_with_paren(left, collector, value, true)
|
45
|
+
else
|
46
|
+
grouping_parentheses left, collector, false
|
47
|
+
end
|
48
|
+
|
49
|
+
collector << value
|
50
|
+
|
51
|
+
right = o.right.is_a?(Nodes::Grouping) ? o.right.expr : o.right
|
52
|
+
collector = if right.class == o.class
|
53
|
+
infix_value_with_paren(right, collector, value, true)
|
54
|
+
else
|
55
|
+
grouping_parentheses right, collector, false
|
56
|
+
end
|
57
|
+
|
58
|
+
collector << " )" unless suppress_parens
|
59
|
+
collector
|
60
|
+
end
|
36
61
|
end
|
37
62
|
end
|
38
63
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.0.0.
|
4
|
+
version: 8.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 8.0.0.
|
19
|
+
version: 8.0.0.rc1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 8.0.0.
|
26
|
+
version: 8.0.0.rc1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 8.0.0.
|
33
|
+
version: 8.0.0.rc1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 8.0.0.
|
40
|
+
version: 8.0.0.rc1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: timeout
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -318,7 +318,6 @@ files:
|
|
318
318
|
- lib/active_record/relation/predicate_builder/relation_handler.rb
|
319
319
|
- lib/active_record/relation/query_attribute.rb
|
320
320
|
- lib/active_record/relation/query_methods.rb
|
321
|
-
- lib/active_record/relation/record_fetch_warning.rb
|
322
321
|
- lib/active_record/relation/spawn_methods.rb
|
323
322
|
- lib/active_record/relation/where_clause.rb
|
324
323
|
- lib/active_record/result.rb
|
@@ -476,10 +475,10 @@ licenses:
|
|
476
475
|
- MIT
|
477
476
|
metadata:
|
478
477
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
479
|
-
changelog_uri: https://github.com/rails/rails/blob/v8.0.0.
|
480
|
-
documentation_uri: https://api.rubyonrails.org/v8.0.0.
|
478
|
+
changelog_uri: https://github.com/rails/rails/blob/v8.0.0.rc1/activerecord/CHANGELOG.md
|
479
|
+
documentation_uri: https://api.rubyonrails.org/v8.0.0.rc1/
|
481
480
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
482
|
-
source_code_uri: https://github.com/rails/rails/tree/v8.0.0.
|
481
|
+
source_code_uri: https://github.com/rails/rails/tree/v8.0.0.rc1/activerecord
|
483
482
|
rubygems_mfa_required: 'true'
|
484
483
|
post_install_message:
|
485
484
|
rdoc_options:
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveRecord
|
4
|
-
class Relation
|
5
|
-
module RecordFetchWarning
|
6
|
-
# Deprecated: subscribe to sql.active_record notifications and
|
7
|
-
# access the row count field to detect large result set sizes.
|
8
|
-
#
|
9
|
-
# When this module is prepended to ActiveRecord::Relation and
|
10
|
-
# +config.active_record.warn_on_records_fetched_greater_than+ is
|
11
|
-
# set to an integer, if the number of records a query returns is
|
12
|
-
# greater than the value of +warn_on_records_fetched_greater_than+,
|
13
|
-
# a warning is logged. This allows for the detection of queries that
|
14
|
-
# return a large number of records, which could cause memory bloat.
|
15
|
-
#
|
16
|
-
# In most cases, fetching large number of records can be performed
|
17
|
-
# efficiently using the ActiveRecord::Batches methods.
|
18
|
-
# See ActiveRecord::Batches for more information.
|
19
|
-
def exec_queries
|
20
|
-
QueryRegistry.reset
|
21
|
-
|
22
|
-
super.tap do |records|
|
23
|
-
if model.logger && ActiveRecord.warn_on_records_fetched_greater_than
|
24
|
-
if records.length > ActiveRecord.warn_on_records_fetched_greater_than
|
25
|
-
model.logger.warn "Query fetched #{records.size} #{@klass} records: #{QueryRegistry.queries.join(";")}"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# :stopdoc:
|
32
|
-
ActiveSupport::Notifications.subscribe("sql.active_record") do |*, payload|
|
33
|
-
QueryRegistry.queries << payload[:sql]
|
34
|
-
end
|
35
|
-
# :startdoc:
|
36
|
-
|
37
|
-
module QueryRegistry # :nodoc:
|
38
|
-
extend self
|
39
|
-
|
40
|
-
def queries
|
41
|
-
ActiveSupport::IsolatedExecutionState[:active_record_query_registry] ||= []
|
42
|
-
end
|
43
|
-
|
44
|
-
def reset
|
45
|
-
queries.clear
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
ActiveRecord::Relation.prepend ActiveRecord::Relation::RecordFetchWarning
|