ActiveRecord不会将更改保存回db

时间:2013-07-14 19:14:05

标签: ruby-on-rails-3 activerecord

我在包含网站网址的模型上运行以下代码。它应该剥离'www。'从每个URL并将记录保存回db。但是,有记录显示更改的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

3 个答案:

答案 0 :(得分:3)

不要更改activerecord模型属性 - 您会混淆更改跟踪,而activerecord会认为您没有做任何更改。

取而代之的是

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

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

答案 1 :(得分:1)

尝试更改:

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

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

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

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

答案 2 :(得分:1)

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

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

我还会将含糊不清的命名从strip更改为clean_urls!