假设我有 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/

10-10 23:04