假设我有 User 1-n 和 UserNotification
问题是我不知道为什么每次我尝试保存 UserNotification 时,rails auto SELECT the user of that UserNotification 都会触发 n + 1 问题
例如
UserNotification.where(id: [1,2,3]).update(updated_at: Time.current)
将生成这些 SQL
UserNotification Load (0.4ms) SELECT `user_notifications`.* FROM `user_notifications` WHERE `user_notifications`.`id` IN (1, 2, 3)
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` IN (3, 1)
User Load (0.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 4
UserNotification 模型很简单belongs_to :user
我已经阅读了更新源代码,但仍然不知道
有任何想法吗 ?
最佳答案
问题是 Rails 5 使默认情况下属于必需。然后每次更新记录时,它都会加载关联以验证其存在。你可以做的(我不知道这有多干净,但在 Rails 修复它之前我想这很好),是添加一个自定义验证来验证属于存在,这样它只在创建或更改关联记录时运行。
belongs_to :my_association, optional: true
validate :my_association, presence: true, if: :needs_validate_my_association_presence?
def needs_validate_my_association_presence?
new_record? || my_association_id_changed?
end
在你的情况下
my_association
将是 user
关于ruby-on-rails - 调用保存时触发Railsbelongs_to,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46700161/