Rails使用哈希

时间:2018-05-29 03:39:01

标签: mysql ruby-on-rails ruby activerecord

我需要迭代更新我的数据。

但我实现的以下方式太费时了。

我可以使用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 :(得分: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>'
}

重要:如果需要,请尝试在子句中添加一些反斜杠(\)。