activerecord 6.1.0 → 6.1.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


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

Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +305 -17
  3. data/README.rdoc +1 -1
  4. data/lib/active_record/aggregations.rb +4 -4
  5. data/lib/active_record/association_relation.rb +10 -0
  6. data/lib/active_record/associations/association.rb +13 -7
  7. data/lib/active_record/associations/association_scope.rb +7 -5
  8. data/lib/active_record/associations/belongs_to_association.rb +8 -5
  9. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +7 -2
  10. data/lib/active_record/associations/builder/association.rb +23 -2
  11. data/lib/active_record/associations/builder/belongs_to.rb +2 -2
  12. data/lib/active_record/associations/has_many_association.rb +1 -1
  13. data/lib/active_record/associations/join_dependency/join_association.rb +8 -7
  14. data/lib/active_record/associations/join_dependency.rb +1 -1
  15. data/lib/active_record/associations.rb +6 -2
  16. data/lib/active_record/attributes.rb +1 -1
  17. data/lib/active_record/coders/yaml_column.rb +11 -1
  18. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +4 -4
  19. data/lib/active_record/connection_adapters/abstract/database_statements.rb +1 -1
  20. data/lib/active_record/connection_adapters/abstract/query_cache.rb +1 -1
  21. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +1 -1
  22. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +4 -0
  23. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +7 -1
  24. data/lib/active_record/connection_adapters/abstract/transaction.rb +14 -3
  25. data/lib/active_record/connection_adapters/abstract_adapter.rb +10 -11
  26. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +6 -2
  27. data/lib/active_record/connection_adapters/mysql/quoting.rb +17 -2
  28. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +4 -1
  29. data/lib/active_record/connection_adapters/pool_config.rb +13 -3
  30. data/lib/active_record/connection_adapters/pool_manager.rb +5 -1
  31. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +1 -1
  32. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  33. data/lib/active_record/connection_adapters/postgresql_adapter.rb +2 -8
  34. data/lib/active_record/connection_adapters/schema_cache.rb +9 -1
  35. data/lib/active_record/connection_adapters/sql_type_metadata.rb +0 -2
  36. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -1
  37. data/lib/active_record/connection_adapters.rb +2 -0
  38. data/lib/active_record/connection_handling.rb +20 -12
  39. data/lib/active_record/core.rb +58 -29
  40. data/lib/active_record/database_configurations/url_config.rb +1 -1
  41. data/lib/active_record/enum.rb +52 -34
  42. data/lib/active_record/fixtures.rb +5 -2
  43. data/lib/active_record/gem_version.rb +1 -1
  44. data/lib/active_record/insert_all.rb +5 -1
  45. data/lib/active_record/locking/optimistic.rb +14 -4
  46. data/lib/active_record/log_subscriber.rb +3 -2
  47. data/lib/active_record/migration/compatibility.rb +2 -1
  48. data/lib/active_record/migration.rb +1 -1
  49. data/lib/active_record/model_schema.rb +4 -4
  50. data/lib/active_record/railties/console_sandbox.rb +2 -4
  51. data/lib/active_record/railties/databases.rake +16 -9
  52. data/lib/active_record/reflection.rb +1 -1
  53. data/lib/active_record/relation/calculations.rb +6 -2
  54. data/lib/active_record/relation/finder_methods.rb +1 -1
  55. data/lib/active_record/relation/predicate_builder/association_query_value.rb +3 -3
  56. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +9 -5
  57. data/lib/active_record/relation/predicate_builder.rb +5 -6
  58. data/lib/active_record/relation/query_methods.rb +9 -6
  59. data/lib/active_record/relation/where_clause.rb +17 -14
  60. data/lib/active_record/relation.rb +10 -17
  61. data/lib/active_record/scoping/default.rb +1 -3
  62. data/lib/active_record/signed_id.rb +1 -1
  63. data/lib/active_record/statement_cache.rb +2 -2
  64. data/lib/active_record/table_metadata.rb +6 -3
  65. data/lib/active_record/tasks/database_tasks.rb +1 -0
  66. data/lib/active_record/test_fixtures.rb +42 -1
  67. data/lib/active_record/transactions.rb +4 -2
  68. data/lib/active_record/validations/numericality.rb +1 -1
  69. data/lib/arel/collectors/bind.rb +2 -2
  70. data/lib/arel/collectors/composite.rb +3 -3
  71. data/lib/arel/collectors/sql_string.rb +1 -1
  72. data/lib/arel/collectors/substitute_binds.rb +1 -1
  73. data/lib/arel/nodes/homogeneous_in.rb +4 -0
  74. data/lib/arel/predications.rb +2 -2
  75. data/lib/arel/visitors/to_sql.rb +1 -1
  76. metadata +10 -10
@@ -1081,12 +1081,15 @@ module ActiveRecord
1081
1081
  when String, Array
1082
1082
  parts = [klass.sanitize_sql(rest.empty? ? opts : [opts, *rest])]
1083
1083
  when Hash
1084
- opts = opts.stringify_keys
1084
+ opts = opts.transform_keys do |key|
1085
+ key = key.to_s
1086
+ klass.attribute_aliases[key] || key
1087
+ end
1085
1088
  references = PredicateBuilder.references(opts)
1086
1089
  self.references_values |= references unless references.empty?
1087
1090
 
1088
1091
  parts = predicate_builder.build_from_hash(opts) do |table_name|
1089
- lookup_reflection_from_join_dependencies(table_name)
1092
+ lookup_table_klass_from_join_dependencies(table_name)
1090
1093
  end
1091
1094
  when Arel::Nodes::Node
1092
1095
  parts = [opts]
@@ -1099,9 +1102,9 @@ module ActiveRecord
1099
1102
  alias :build_having_clause :build_where_clause
1100
1103
 
1101
1104
  private
1102
- def lookup_reflection_from_join_dependencies(table_name)
1105
+ def lookup_table_klass_from_join_dependencies(table_name)
1103
1106
  each_join_dependencies do |join|
1104
- return join.reflection if table_name == join.table_name
1107
+ return join.base_klass if table_name == join.table_name
1105
1108
  end
1106
1109
  nil
1107
1110
  end
@@ -1130,7 +1133,7 @@ module ActiveRecord
1130
1133
  raise ImmutableRelation if defined?(@arel) && @arel
1131
1134
  end
1132
1135
 
1133
- def build_arel(aliases)
1136
+ def build_arel(aliases = nil)
1134
1137
  arel = Arel::SelectManager.new(table)
1135
1138
 
1136
1139
  build_joins(arel.join_sources, aliases)
@@ -1312,7 +1315,7 @@ module ActiveRecord
1312
1315
  elsif field.match?(/\A\w+\.\w+\z/)
1313
1316
  table, column = field.split(".")
1314
1317
  predicate_builder.resolve_arel_attribute(table, column) do
1315
- lookup_reflection_from_join_dependencies(table)
1318
+ lookup_table_klass_from_join_dependencies(table)
1316
1319
  end
1317
1320
  else
1318
1321
  yield field
@@ -58,8 +58,8 @@ module ActiveRecord
58
58
  end
59
59
  end
60
60
 
61
- def to_h(table_name = nil)
62
- equalities(predicates).each_with_object({}) do |node, hash|
61
+ def to_h(table_name = nil, equality_only: false)
62
+ equalities(predicates, equality_only).each_with_object({}) do |node, hash|
63
63
  next if table_name&.!= node.left.relation.name
64
64
  name = node.left.name.to_s
65
65
  value = extract_node_value(node.right)
@@ -103,28 +103,31 @@ module ActiveRecord
103
103
  end
104
104
 
105
105
  def extract_attributes
106
- predicates.each_with_object([]) do |node, attrs|
107
- attr = extract_attribute(node) || begin
108
- node.left if node.equality? && node.left.is_a?(Arel::Predications)
109
- end
110
- attrs << attr if attr
111
- end
106
+ attrs = []
107
+ each_attributes { |attr, _| attrs << attr }
108
+ attrs
112
109
  end
113
110
 
114
111
  protected
115
112
  attr_reader :predicates
116
113
 
117
114
  def referenced_columns
118
- predicates.each_with_object({}) do |node, hash|
115
+ hash = {}
116
+ each_attributes { |attr, node| hash[attr] = node }
117
+ hash
118
+ end
119
+
120
+ private
121
+ def each_attributes
122
+ predicates.each do |node|
119
123
  attr = extract_attribute(node) || begin
120
124
  node.left if equality_node?(node) && node.left.is_a?(Arel::Predications)
121
125
  end
122
126
 
123
- hash[attr] = node if attr
127
+ yield attr, node if attr
124
128
  end
125
129
  end
126
130
 
127
- private
128
131
  def extract_attribute(node)
129
132
  attr_node = nil
130
133
  Arel.fetch_attribute(node) do |attr|
@@ -134,14 +137,14 @@ module ActiveRecord
134
137
  attr_node
135
138
  end
136
139
 
137
- def equalities(predicates)
140
+ def equalities(predicates, equality_only)
138
141
  equalities = []
139
142
 
140
143
  predicates.each do |node|
141
- if equality_node?(node)
144
+ if equality_only ? Arel::Nodes::Equality === node : equality_node?(node)
142
145
  equalities << node
143
146
  elsif node.is_a?(Arel::Nodes::And)
144
- equalities.concat equalities(node.children)
147
+ equalities.concat equalities(node.children, equality_only)
145
148
  end
146
149
  end
147
150
 
@@ -440,13 +440,11 @@ module ActiveRecord
440
440
  def update_all(updates)
441
441
  raise ArgumentError, "Empty list of attributes to change" if updates.blank?
442
442
 
443
- if eager_loading?
444
- relation = apply_join_dependency
445
- return relation.update_all(updates)
446
- end
443
+ arel = eager_loading? ? apply_join_dependency.arel : build_arel
444
+ arel.source.left = table
447
445
 
448
446
  stmt = Arel::UpdateManager.new
449
- stmt.table(arel.join_sources.empty? ? table : arel.source)
447
+ stmt.table(arel.source)
450
448
  stmt.key = table[primary_key]
451
449
  stmt.take(arel.limit)
452
450
  stmt.offset(arel.offset)
@@ -465,7 +463,7 @@ module ActiveRecord
465
463
  stmt.set Arel.sql(klass.sanitize_sql_for_assignment(updates, table.name))
466
464
  end
467
465
 
468
- @klass.connection.update stmt, "#{@klass} Update All"
466
+ klass.connection.update(stmt, "#{klass} Update All").tap { reset }
469
467
  end
470
468
 
471
469
  def update(id = :all, attributes) # :nodoc:
@@ -582,23 +580,18 @@ module ActiveRecord
582
580
  raise ActiveRecordError.new("delete_all doesn't support #{invalid_methods.join(', ')}")
583
581
  end
584
582
 
585
- if eager_loading?
586
- relation = apply_join_dependency
587
- return relation.delete_all
588
- end
583
+ arel = eager_loading? ? apply_join_dependency.arel : build_arel
584
+ arel.source.left = table
589
585
 
590
586
  stmt = Arel::DeleteManager.new
591
- stmt.from(arel.join_sources.empty? ? table : arel.source)
587
+ stmt.from(arel.source)
592
588
  stmt.key = table[primary_key]
593
589
  stmt.take(arel.limit)
594
590
  stmt.offset(arel.offset)
595
591
  stmt.order(*arel.orders)
596
592
  stmt.wheres = arel.constraints
597
593
 
598
- affected = @klass.connection.delete(stmt, "#{@klass} Destroy")
599
-
600
- reset
601
- affected
594
+ klass.connection.delete(stmt, "#{klass} Destroy").tap { reset }
602
595
  end
603
596
 
604
597
  # Finds and destroys all records matching the specified conditions.
@@ -652,6 +645,7 @@ module ActiveRecord
652
645
  @delegate_to_klass = false
653
646
  @to_sql = @arel = @loaded = @should_eager_load = nil
654
647
  @offsets = @take = nil
648
+ @cache_keys = nil
655
649
  @records = [].freeze
656
650
  self
657
651
  end
@@ -683,8 +677,7 @@ module ActiveRecord
683
677
  end
684
678
 
685
679
  def scope_for_create
686
- hash = where_values_hash
687
- hash.delete(klass.inheritance_column) if klass.finder_needs_type_condition?
680
+ hash = where_clause.to_h(klass.table_name, equality_only: true)
688
681
  create_with_value.each { |k, v| hash[k.to_s] = v } unless create_with_value.empty?
689
682
  hash
690
683
  end
@@ -109,9 +109,7 @@ module ActiveRecord
109
109
  if default_scope_override
110
110
  # The user has defined their own default scope method, so call that
111
111
  evaluate_default_scope do
112
- if scope = default_scope
113
- relation.merge!(scope)
114
- end
112
+ relation.scoping { default_scope }
115
113
  end
116
114
  elsif default_scopes.any?
117
115
  evaluate_default_scope do
@@ -20,7 +20,7 @@ module ActiveRecord
20
20
  # a certain time period.
21
21
  #
22
22
  # You set the time period that the signed id is valid for during generation, using the instance method
23
- # +signed_id(expires_in: 15.minutes)+. If the time has elapsed before a signed find is attempted,
23
+ # <tt>signed_id(expires_in: 15.minutes)</tt>. If the time has elapsed before a signed find is attempted,
24
24
  # the signed id will no longer be valid, and nil is returned.
25
25
  #
26
26
  # It's possible to further restrict the use of a signed id with a purpose. This helps when you have a
@@ -80,8 +80,8 @@ module ActiveRecord
80
80
  self
81
81
  end
82
82
 
83
- def add_binds(binds)
84
- @binds.concat binds
83
+ def add_binds(binds, proc_for_binds = nil)
84
+ @binds.concat proc_for_binds ? binds.map(&proc_for_binds) : binds
85
85
  binds.size.times do |i|
86
86
  @parts << ", " unless i == 0
87
87
  @parts << Substitute.new
@@ -33,10 +33,13 @@ module ActiveRecord
33
33
  return self
34
34
  end
35
35
 
36
- reflection ||= yield table_name if block_given?
36
+ if reflection
37
+ association_klass = reflection.klass unless reflection.polymorphic?
38
+ elsif block_given?
39
+ association_klass = yield table_name
40
+ end
37
41
 
38
- if reflection && !reflection.polymorphic?
39
- association_klass = reflection.klass
42
+ if association_klass
40
43
  arel_table = association_klass.arel_table
41
44
  arel_table = arel_table.alias(table_name) if arel_table.name != table_name
42
45
  TableMetadata.new(association_klass, arel_table, reflection)
@@ -380,6 +380,7 @@ module ActiveRecord
380
380
  filename = dump_filename(db_config.name, format)
381
381
  connection = ActiveRecord::Base.connection
382
382
 
383
+ FileUtils.mkdir_p(db_dir)
383
384
  case format
384
385
  when :ruby
385
386
  File.open(filename, "w:utf-8") do |file|
@@ -111,6 +111,8 @@ module ActiveRecord
111
111
  @fixture_connections = []
112
112
  @@already_loaded_fixtures ||= {}
113
113
  @connection_subscriber = nil
114
+ @legacy_saved_pool_configs = Hash.new { |hash, key| hash[key] = {} }
115
+ @saved_pool_configs = Hash.new { |hash, key| hash[key] = {} }
114
116
 
115
117
  # Load fixtures once and begin transaction.
116
118
  if run_in_transaction?
@@ -169,6 +171,7 @@ module ActiveRecord
169
171
  connection.pool.lock_thread = false
170
172
  end
171
173
  @fixture_connections.clear
174
+ teardown_shared_connection_pool
172
175
  else
173
176
  ActiveRecord::FixtureSet.reset_cache
174
177
  end
@@ -200,8 +203,13 @@ module ActiveRecord
200
203
  return unless writing_pool_manager
201
204
 
202
205
  pool_manager = handler.send(:owner_to_pool_manager)[name]
206
+ @legacy_saved_pool_configs[handler][name] ||= {}
203
207
  pool_manager.shard_names.each do |shard_name|
204
208
  writing_pool_config = writing_pool_manager.get_pool_config(nil, shard_name)
209
+ pool_config = pool_manager.get_pool_config(nil, shard_name)
210
+ next if pool_config == writing_pool_config
211
+
212
+ @legacy_saved_pool_configs[handler][name][shard_name] = pool_config
205
213
  pool_manager.set_pool_config(nil, shard_name, writing_pool_config)
206
214
  end
207
215
  end
@@ -214,8 +222,12 @@ module ActiveRecord
214
222
  pool_manager = handler.send(:owner_to_pool_manager)[name]
215
223
  pool_manager.shard_names.each do |shard_name|
216
224
  writing_pool_config = pool_manager.get_pool_config(ActiveRecord::Base.writing_role, shard_name)
225
+ @saved_pool_configs[name][shard_name] ||= {}
217
226
  pool_manager.role_names.each do |role|
218
- next unless pool_manager.get_pool_config(role, shard_name)
227
+ next unless pool_config = pool_manager.get_pool_config(role, shard_name)
228
+ next if pool_config == writing_pool_config
229
+
230
+ @saved_pool_configs[name][shard_name][role] = pool_config
219
231
  pool_manager.set_pool_config(role, shard_name, writing_pool_config)
220
232
  end
221
233
  end
@@ -223,6 +235,35 @@ module ActiveRecord
223
235
  end
224
236
  end
225
237
 
238
+ def teardown_shared_connection_pool
239
+ if ActiveRecord::Base.legacy_connection_handling
240
+ @legacy_saved_pool_configs.each_pair do |handler, names|
241
+ names.each_pair do |name, shards|
242
+ shards.each_pair do |shard_name, pool_config|
243
+ pool_manager = handler.send(:owner_to_pool_manager)[name]
244
+ pool_manager.set_pool_config(nil, shard_name, pool_config)
245
+ end
246
+ end
247
+ end
248
+ else
249
+ handler = ActiveRecord::Base.connection_handler
250
+
251
+ @saved_pool_configs.each_pair do |name, shards|
252
+ pool_manager = handler.send(:owner_to_pool_manager)[name]
253
+ shards.each_pair do |shard_name, roles|
254
+ roles.each_pair do |role, pool_config|
255
+ next unless pool_manager.get_pool_config(role, shard_name)
256
+
257
+ pool_manager.set_pool_config(role, shard_name, pool_config)
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ @legacy_saved_pool_configs.clear
264
+ @saved_pool_configs.clear
265
+ end
266
+
226
267
  def load_fixtures(config)
227
268
  ActiveRecord::FixtureSet.create_fixtures(fixture_path, fixture_table_names, fixture_class_names, config).index_by(&:name)
228
269
  end
@@ -271,8 +271,10 @@ module ActiveRecord
271
271
  if options[:on]
272
272
  fire_on = Array(options[:on])
273
273
  assert_valid_transaction_action(fire_on)
274
- options[:if] = Array(options[:if])
275
- options[:if].unshift(-> { transaction_include_any_action?(fire_on) })
274
+ options[:if] = [
275
+ -> { transaction_include_any_action?(fire_on) },
276
+ *options[:if]
277
+ ]
276
278
  end
277
279
  end
278
280
 
@@ -4,7 +4,7 @@ module ActiveRecord
4
4
  module Validations
5
5
  class NumericalityValidator < ActiveModel::Validations::NumericalityValidator # :nodoc:
6
6
  def validate_each(record, attribute, value, precision: nil, scale: nil)
7
- precision = [column_precision_for(record, attribute) || BigDecimal.double_fig, BigDecimal.double_fig].min
7
+ precision = [column_precision_for(record, attribute) || Float::DIG, Float::DIG].min
8
8
  scale = column_scale_for(record, attribute)
9
9
  super(record, attribute, value, precision: precision, scale: scale)
10
10
  end
@@ -16,8 +16,8 @@ module Arel # :nodoc: all
16
16
  self
17
17
  end
18
18
 
19
- def add_binds(binds)
20
- @binds.concat binds
19
+ def add_binds(binds, proc_for_binds = nil)
20
+ @binds.concat proc_for_binds ? binds.map(&proc_for_binds) : binds
21
21
  self
22
22
  end
23
23
 
@@ -22,9 +22,9 @@ module Arel # :nodoc: all
22
22
  self
23
23
  end
24
24
 
25
- def add_binds(binds, &block)
26
- left.add_binds(binds, &block)
27
- right.add_binds(binds, &block)
25
+ def add_binds(binds, proc_for_binds = nil, &block)
26
+ left.add_binds(binds, proc_for_binds, &block)
27
+ right.add_binds(binds, proc_for_binds, &block)
28
28
  self
29
29
  end
30
30
 
@@ -18,7 +18,7 @@ module Arel # :nodoc: all
18
18
  self
19
19
  end
20
20
 
21
- def add_binds(binds, &block)
21
+ def add_binds(binds, proc_for_binds = nil, &block)
22
22
  self << (@bind_index...@bind_index += binds.size).map(&block).join(", ")
23
23
  self
24
24
  end
@@ -20,7 +20,7 @@ module Arel # :nodoc: all
20
20
  self << quoter.quote(bind)
21
21
  end
22
22
 
23
- def add_binds(binds)
23
+ def add_binds(binds, proc_for_binds = nil)
24
24
  self << binds.map { |bind| quoter.quote(bind) }.join(", ")
25
25
  end
26
26
 
@@ -55,6 +55,10 @@ module Arel # :nodoc: all
55
55
  casted_values
56
56
  end
57
57
 
58
+ def proc_for_binds
59
+ -> value { ActiveModel::Attribute.with_cast_value(attribute.name, value, attribute.type_caster) }
60
+ end
61
+
58
62
  def fetch_attribute(&block)
59
63
  if attribute
60
64
  yield attribute
@@ -207,11 +207,11 @@ module Arel # :nodoc: all
207
207
  end
208
208
 
209
209
  def contains(other)
210
- Arel::Nodes::Contains.new(self, other)
210
+ Arel::Nodes::Contains.new self, quoted_node(other)
211
211
  end
212
212
 
213
213
  def overlaps(other)
214
- Arel::Nodes::Overlaps.new(self, other)
214
+ Arel::Nodes::Overlaps.new self, quoted_node(other)
215
215
  end
216
216
 
217
217
  def quoted_array(others)
@@ -337,7 +337,7 @@ module Arel # :nodoc: all
337
337
  if values.empty?
338
338
  collector << @connection.quote(nil)
339
339
  else
340
- collector.add_binds(values, &bind_block)
340
+ collector.add_binds(values, o.proc_for_binds, &bind_block)
341
341
  end
342
342
 
343
343
  collector << ")"
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: 6.1.0
4
+ version: 6.1.4
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: 2020-12-09 00:00:00.000000000 Z
11
+ date: 2021-06-24 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: 6.1.0
19
+ version: 6.1.4
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: 6.1.0
26
+ version: 6.1.4
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: 6.1.0
33
+ version: 6.1.4
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: 6.1.0
40
+ version: 6.1.4
41
41
  description: Databases on Rails. Build a persistent domain model by mapping database
42
42
  tables to Ruby classes. Strong conventions for associations, validations, aggregations,
43
43
  migrations, and testing come baked-in.
@@ -390,10 +390,10 @@ licenses:
390
390
  - MIT
391
391
  metadata:
392
392
  bug_tracker_uri: https://github.com/rails/rails/issues
393
- changelog_uri: https://github.com/rails/rails/blob/v6.1.0/activerecord/CHANGELOG.md
394
- documentation_uri: https://api.rubyonrails.org/v6.1.0/
393
+ changelog_uri: https://github.com/rails/rails/blob/v6.1.4/activerecord/CHANGELOG.md
394
+ documentation_uri: https://api.rubyonrails.org/v6.1.4/
395
395
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
396
- source_code_uri: https://github.com/rails/rails/tree/v6.1.0/activerecord
396
+ source_code_uri: https://github.com/rails/rails/tree/v6.1.4/activerecord
397
397
  post_install_message:
398
398
  rdoc_options:
399
399
  - "--main"
@@ -411,7 +411,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
411
  - !ruby/object:Gem::Version
412
412
  version: '0'
413
413
  requirements: []
414
- rubygems_version: 3.1.4
414
+ rubygems_version: 3.1.2
415
415
  signing_key:
416
416
  specification_version: 4
417
417
  summary: Object-relational mapper framework (part of Rails).