1

Web サイトの URL を含むモデルで次のコードを実行しています。「www.」を取り除く必要があります。すべての URL から取得し、レコードをデータベースに保存します。ただし、変更された URL が単純に保存されないレコードがあります。コンソール経由で .sub ルーチンをテストしたところ、文字列が変更されましたが、変更が保存されませんでした。

def strip
   b = Sites.all
   b.each do |t|
     t.url.sub!(/www./, '') 
     t.save
  end
end

また、上記のコードを Rails コンソールで直接実行したところ、出力は次のようになりました (ここでも、何も保存されませんでした)。

   (0.0ms)  commit transaction
   (0.0ms)  begin transaction
   (0.0ms)  commit transaction
   (0.0ms)  begin transaction
   (0.0ms)  commit transaction
   (0.0ms)  begin transaction
   (0.0ms)  commit transaction
   (0.0ms)  begin transaction
   (0.0ms)  commit transaction
4

3 に答える 3

1

列を更新するためだけにすべての行を反復処理しないでください。より良い代替案をお勧めします:

def strip
  Site.update_all('url = REPLACE(url, "www.", "")')
end

また、あいまいな命名を からstripに変更しclean_urls!ます。

于 2013-07-14T19:33:03.897 に答える
1

変更してみてください:

    t.url.sub!(/www./, '')

    t.url= t.url.sub(/www./, '')

Activerecord は変更を追跡し、変更されたと思われるフィールドのみが update 句の一部になります。sub! を使用して t.url を直接変更する フィールドを変更済みとしてマークしていません (Activerecord のバグかもしれません)。

別の提案は、パターンを /www\./ に変更することです。どんなキャラクターともマッチします。

于 2013-07-14T19:28:55.713 に答える