Merge pull request #51339 from gjtorikian/enable-n_plus_one_only-toggling

Allow one to set `strict_loading_mode` globally
This commit is contained in:
Eileen M. Uchitelle 2024-06-03 06:12:04 -07:00 committed by GitHub
commit 9cafa55ddd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 28 additions and 1 deletions

View File

@ -1,3 +1,9 @@
* Allow to configure `strict_loading_mode` globally or within a model.
Defaults to `:all`, can be changed to `:n_plus_one_only`.
*Garen Torikian*
* Add `ActiveRecord::Relation#readonly?`.
Reflects if the relation has been marked as readonly.

View File

@ -89,6 +89,7 @@ module ActiveRecord
class_attribute :belongs_to_required_by_default, instance_accessor: false
class_attribute :strict_loading_by_default, instance_accessor: false, default: false
class_attribute :strict_loading_mode, instance_accessor: false, default: :all
class_attribute :has_many_inversing, instance_accessor: false, default: false
@ -784,7 +785,7 @@ module ActiveRecord
@primary_key = klass.primary_key
@strict_loading = klass.strict_loading_by_default
@strict_loading_mode = :all
@strict_loading_mode = klass.strict_loading_mode
klass.define_attribute_methods
end

View File

@ -98,6 +98,20 @@ class StrictLoadingTest < ActiveRecord::TestCase
end
end
def test_default_mode_is_all
developer = Developer.first
assert_predicate developer, :strict_loading_all?
end
def test_default_mode_can_be_changed_globally
developer = Class.new(ActiveRecord::Base) do
self.strict_loading_mode = :n_plus_one_only
self.table_name = "developers"
end.new
assert_predicate developer, :strict_loading_n_plus_one_only?
end
def test_strict_loading
Developer.all.each { |d| assert_not d.strict_loading? }
Developer.strict_loading.each { |d| assert_predicate d, :strict_loading? }

View File

@ -1284,6 +1284,12 @@ changed to `:log` to send violations to the logger instead of raising.
Is a boolean value that either enables or disables strict_loading mode by
default. Defaults to `false`.
#### `config.active_record.strict_loading_mode`
Sets the mode in which strict loading is reported. Defaults to `:all`. It can be
changed to `:n_plus_one_only` to only report when loading associations that will
lead to an N + 1 query.
#### `config.active_record.warn_on_records_fetched_greater_than`
Allows setting a warning threshold for query result size. If the number of