1

我在包含网站 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

3

不要就地更改 activerecord 模型属性 - 您会混淆更改跟踪,并且 activerecord 会认为您没有进行任何更改。

而是做

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

您还应该.在 URL 中转义,或者匹配 www 之后的任何字符。

于 2013-07-14T19:27:43.440 回答
1

尝试改变:

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

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

Activerecord 跟踪更改,并且只有它认为已更改的字段才是更新子句的一部分。使用 sub 直接更改 t.url!没有将该字段标记为已更改(可能是 Activerecord 中的错误)。

另一个建议将您的模式更改为 /www\./,否则 . 匹配任何字符。

于 2013-07-14T19:28:55.713 回答
1

不要为了更新列而遍历每一行。我建议一个更好的选择:

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

我还将模棱两可的命名从更改stripclean_urls!.

于 2013-07-14T19:33:03.897 回答