0

データベース内の一部のデータをサニタイズ (スラッシュを削除) するために実行する必要がある rake タスクがあります。タスクは次のとおりです。

namespace :db do
  desc "Remove slashes from old-style URLs"
  task :substitute_slashes => :environment do
    puts "Starting"
    contents = Content.all
    contents.each do |c|
      if c.permalink != nil
        c.permalink.gsub!("/","")
        c.save!
      end
    end
    puts "Finished"    
  end
end

これにより、実行できますrake db:substitute_slashes --trace

私がputs c.permalinkgsubの後に行う場合!属性が適切に設定されていることがわかります。しかし、保存!データが変更されていないため、機能していないようです。誰かが問題の原因を特定できますか?

もう1つのことは、ペーパークリップがインストールされていて、このタスクがトリガーされている[paperclip] Saving attachments.ことです。

4

2 に答える 2

2

これを試して:

namespace :db do
  desc "Remove slashes from old-style URLs"
  task :substitute_slashes => :environment do
    puts "Starting"
    contents = Content.all
    contents.each do |c|
      unless c.permalink.nil?
        c.permalink = c.permalink.gsub(/\//,'')
        c.save!
      end
    end
    puts "Finished"    
  end
end

1.) != nil を not record.item.nil? に変更します。(違いがあるかどうかはわかりませんが、 != nil を使用したことはありません。コードから判断すると、 .blank? を使用することもできます)

2.) gsub の形式が正しくありません。パターンは 2 つの / (/ スタッフ /) の間にある必要があります。/ をエスケープする必要があるため、\ が必要です。

3.) Bang (!) は、オブジェクトをその場で更新します。あなたの最大の問題は、あなたが ! を使いすぎていることだと思います。

4.) また、これは非常に非効率的です... すべてのレコードを見て、すべてのレコードを更新しています。Rails が常に最良の選択肢であるとは限りません。SQL を学び、これを 1 行で実行します。

"UPDATE contents SET permalink = replace(permalink, '/', '');"

Rails を使用する必要がある場合:

ActiveRecord::Base.connection.execute "UPDATE contents SET permalink = replace(permalink, '/', '');"

わお!1 つのクエリ。すばらしい!:)

于 2010-12-29T01:51:03.857 に答える
1

私が次に試みることは

c.permalink = c.permalink.gsub("/","")

コールバックなしでの保存に関しては、このスタックオーバーフロー ページにいくつかの提案があります。

于 2010-12-29T01:55:51.730 に答える