2013-07-14 49 views
1

我在包含網站url的模型上運行以下代碼。它應該去掉'www'。從每個網址並將記錄保存回數據庫。但是,有記錄更改的網址不會被保存。我已經通過控制檯測試了.sub例程,它確實對字符串進行了更改,但是,更改未保存。ActiveRecord不會將更改保存回db

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

我也是在軌控制檯直接跑到上面的代碼和輸出如下(再次,什麼也沒有保存):

(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

不要更改到位的ActiveRecord模型屬性 - 你會混淆變更跟蹤,主動記錄會認爲你沒有做任何改變。

而是做

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

你也應該逃避在URL中.或者你會匹配WWW之後的任何字符。

1

嘗試改變:

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

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

ActiveRecord的跟蹤變化,並且,它認爲只有場,改變爲更新條款的一部分。使用sub直接更改t.url!不會將該字段標記爲已更改(可能是Activerecord中的一個錯誤)。

另一個建議會將您的模式更改爲/www/./,否則。與任何角色匹配。

1

不要迭代每一行來更新列。我建議一個更好的選擇:

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

我也想改變從strip曖昧命名到clean_urls!