質問: [] a << Article.find_by(id: 56) a << Article.find_by(id: 70) a.map(&:content).each { |c| c.gsub!(/hoge-hoge/, "fuga") } => 文字列置換が成功 ``` しかし、実際のArticle.allを置換しようとしても上手くいかない。 ``` Article.all.map(&:content).each { |c| c.gsub!(/hoge-hoge/, "fuga") } => 文字列置換に失敗 ``` この二つの違いは、aはArrayだが、ArticleはActiveRecord_Relationというところだと思っていて、ActiveRecord_Relationに対してmapをかけているから上手くいかないのでは?というところまでは思いついたのですが、具体的な解決策まで思いつかず。 このArticle内のcontentを破壊的に書き換える方法が分かる方がおりましたら、ご教示お願いいたします。 ``` [349] pry(main)> Article.all.class => Article::ActiveRecord_Relation [24] pry(main)> a.class => Array ``` ### 補足情報(FW/ツールのバージョンなど) Rails 5.1.6.2 Postgres 9.5
回答: postgresという事なので ``` # もし、正規表現じゃない置換でいいのなら # Article.all.update_all("content = replace(content, 'hoge-hoge','fuga')") Article.all.update_all("content = regexp_replace(content, 'hoge-hoge','fuga', 'g')") ``` が、使えるかもしれません。 なお、意図しない書き換えが発生する可能性もあるので実行には充分注意して行ってください(特に`regexp_replace`の方は)