Как предотвратить множественные запросы при обновлении записи? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть таблица customers с парой принадлежащих принадлежностей: клиент принадлежит стране, сектору и типу.

При обновлении клиента я получил следующий результат:

> Customer.first.update(notes: "Some extra notes")
  Customer Load (1.4ms)  SELECT  `customers`.* FROM `customers` ORDER BY `customers`.`id` ASC LIMIT 1
  Country Load (1.5ms)  SELECT  `countries`.* FROM `countries` WHERE `countries`.`id` = '26' LIMIT 1
  Sector Load (1.6ms)  SELECT  `sectors`.* FROM `sectors` WHERE `sectors`.`id` = 89 LIMIT 1
  Type Load (1.6ms)  SELECT  `types`.* FROM `types` WHERE `types`.`id` = 8 LIMIT 1
  Customer Update (0.3ms)  UPDATE `customers` SET `notes` = "Some extra notes", `updated_at` = '2019-06-27 08:52:56' WHERE `customers`.`id` = 1

Я думаю, что есть дополнительные запросы, чтобы проверить, действительны ли отношения. Но это крайне медленно при массовом обновлении всех клиентов. Как я могу предотвратить эти дополнительные запросы?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вместо этого вы можете использовать update_attribute, который не запускает никаких проверок на вашей модели.

Customer.first.update_attribute(:notes, 'Some extra notes')

Узнайте больше о update_attribute и других хороших методах

Обновляет отдельный атрибут и сохраняет запись. Это особенно полезно для логических флагов на существующих записях. Также обратите внимание, что

  • Проверка пропущена.

  • Вызваны обратные вызовы.

  • Столбец updated_at / updated_on обновляется, если этот столбец имеется.

  • Обновляет все грязные атрибуты в этом объекте.

0 голосов
/ 27 июня 2019

Вы можете использовать update_columns для пропуска обратных вызовов, если вы действительно уверены, что вам это не нужно.

try

Customer.first.update_columns(notes: "Some extra notes")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...