Nachdem Rails 6.1rc veröffentlicht wurde, haben wir eine neue Funktion zusammengestellt, die Funktion "strict_loading". See: https://weblog.rubyonrails.org/releases/
#strict_loading
Durch Markieren eines Objekts wird die Ausnahme "ActiveRecord :: StrictLoadingViolationError" ausgelöst, wenn das Objekt mit einer Zuordnungsverzögerung geladen wird.
$ dev = Developer.strict_loading.first
$ dev.audit_logs.to_a
=> ActiveRecord::StrictLoadingViolationError: Developer is marked as strict_loading and AuditLog cannot be lazily loaded.
See: https://github.com/rails/rails/pull/37400
class Developer < ApplicationRecord
has_many :projects, strict_loading: true
end
dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError: The projects association is marked as strict_loading and cannot be lazily loaded.
See: https://github.com/rails/rails/pull/38541
class Developer < ApplicationRecord
self.strict_loading_by_default = true
has_many :projects
end
dev = Developer.first
dev.projects.first
# => ActiveRecord::StrictLoadingViolationError Exception: Developer is marked as strict_loading and Project cannot be lazily loaded.
See: https://github.com/rails/rails/pull/39491
config.active_record.action_on_strict_loading_violation
enables raising or logging an exception if strict_loading is set on an association. The default value is:raise
in all environments. It can be changed to:log
to send violations to the logger instead of raising.
config.active_record.action_on_strict_loading_violation = :log
See https://github.com/rails/rails/pull/40511 https://edgeguides.rubyonrails.org/configuring.html#configuring-active-record
Dies ermöglicht es, eine Ausnahme in der Entwicklungs- und Testumgebung auszulösen und die Protokollausgabe in der Produktionsumgebung beizubehalten.
Die Community diskutiert auch aktiv Möglichkeiten, um das Auftreten von N + 1 zu verhindern. https://discuss.rubyonrails.org/t/n-1-queries-should-be-the-exception-not-the-easy-trap-to-fall-in/74537/14
Recommended Posts