Rails обновляет несколько записей с помощью хэша - PullRequest
0 голосов
/ 29 мая 2018

Мне нужно обновлять свои данные итеративно.

Но следующий способ, которого я достиг, слишком трудоемкий.

Могу ли я обновить несколько записей с помощью хеша id-value?

SUBST = ''.freeze
re = /<p>|<\/p>/m
(1..1000).each do |id|
  choice = QuestionChoice.find id
  choice.selections.gsub!(re, SUBST)
  choice.save! if choice.changed?
end

Обновление:

Поскольку я обнаружил, что мой код можно улучшить, используя where

Как и в следующем

QuestionChoice.where(id: (1..1000)).each do |choice|
  choice.selections.gsub!(re, SUBST)
  choice.save! if choice.changed?
end

Но теперьМне по-прежнему нужно звонить save! для каждой записи, которая будет стоить много времени.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Раньше я сталкивался с этой проблемой и решил ее.Попробуйте следующее:

MySQL 8.0 +:

QuestionChoice.where(id: 1..1000).update_all("selections = REGEXP_REPLACE(selections, '<p>|<\/p>', '')")

Другие:

QuestionChoice.where(id: 1..1000).update_all("selections = REPLACE(selections, '</p>', '')")

или

QuestionChoice.where(id: 1..1000).update_all %{
  selections =
    CASE 
    WHEN selections RLIKE '<p>|<\/p>' 
    THEN REPLACE(selections,'<p>|<\/p>', '')
    END 
    WHERE selections RLIKE '<p>|<\/p>'
}

ВАЖНО : при необходимости попробуйте добавить несколько зазоров (\) к вашему шаблону регулярных выражений в предложении.

0 голосов
/ 29 мая 2018

Вы нажимаете 1000 раз подряд, чтобы получить каждую запись отдельно, попробуйте использовать один запрос, чтобы получить все записи, которые нужно обновить:

SUBST = ''.freeze
re = /<p>|<\/p>/m
QuestionChoice.where('id <= 1000').map do |q| 
  q.selections.gsub!(re, SUBST) 
  q.save! if q.changed?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...