Skip to content

Commit

Permalink
Merge pull request #40775 from eileencodes/fix-strict-loading-on-vali…
Browse files Browse the repository at this point in the history
…dations

Fix strict loading on validations
  • Loading branch information
eileencodes authored and rafaelfranca committed Dec 9, 2020
1 parent 5d2e693 commit bf51371
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
4 changes: 2 additions & 2 deletions activerecord/lib/active_record/associations/association.rb
Expand Up @@ -211,11 +211,11 @@ def create!(attributes = nil, &block)

private
def find_target
if owner.strict_loading?
if owner.strict_loading? && owner.validation_context.nil?
Base.strict_loading_violation!(owner: owner.class, association: klass)
end

if reflection.strict_loading?
if reflection.strict_loading? && owner.validation_context.nil?
Base.strict_loading_violation!(owner: owner.class, association: reflection.name)
end

Expand Down
21 changes: 21 additions & 0 deletions activerecord/test/cases/strict_loading_test.rb
Expand Up @@ -86,6 +86,27 @@ def test_raises_if_strict_loading_by_default_and_lazy_loading
end
end

def test_strict_loading_is_ignored_in_validation_context
with_strict_loading_by_default(Developer) do
developer = Developer.first
assert_predicate developer, :strict_loading?

assert_nothing_raised do
AuditLogRequired.create! developer_id: developer.id, message: "i am a message"
end
end
end

def test_strict_loading_with_reflection_is_ignored_in_validation_context
with_strict_loading_by_default(Developer) do
developer = Developer.first
assert_predicate developer, :strict_loading?

developer.required_audit_logs.build(message: "I am message")
developer.save!
end
end

def test_preload_audit_logs_are_strict_loading_because_parent_is_strict_loading
developer = Developer.first

Expand Down
6 changes: 6 additions & 0 deletions activerecord/test/models/developer.rb
Expand Up @@ -72,6 +72,7 @@ def find_least_recent
class_name: "SpecialProject"

has_many :audit_logs
has_many :required_audit_logs, class_name: "AuditLogRequired"
has_many :strict_loading_audit_logs, -> { strict_loading }, class_name: "AuditLog"
has_many :strict_loading_opt_audit_logs, strict_loading: true, class_name: "AuditLog"
has_many :contracts
Expand Down Expand Up @@ -125,6 +126,11 @@ class AuditLog < ActiveRecord::Base
belongs_to :unvalidated_developer, class_name: "Developer"
end

class AuditLogRequired < ActiveRecord::Base
self.table_name = "audit_logs"
belongs_to :developer, required: true
end

class DeveloperWithBeforeDestroyRaise < ActiveRecord::Base
self.table_name = "developers"
has_and_belongs_to_many :projects, join_table: "developers_projects", foreign_key: "developer_id"
Expand Down

0 comments on commit bf51371

Please sign in to comment.