我需要迭代更新我的数据。
但我实现的以下方式太费时了。
我可以使用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!
。
答案 0 :(得分:1)
您按顺序点击db 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
答案 1 :(得分:1)
我曾经面对这个问题而且我解决了这个问题。尝试以下方法:
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>'
}
重要:如果需要,请尝试在子句中添加一些反斜杠(\
)。