我在包含网站网址的模型上运行以下代码。它应该剥离'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
答案 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!
。