2010-01-12 47 views
0

我在locations表有一大堆的记录:闻起来像ActiveRecord的食堂对象属性上保存

... 
*************************** 8. row *************************** 
     id: 8 
     feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/4564.xml 
... 
*************************** 11. row *************************** 
     id: 11 
     feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/5007.xml 
... 

有了这个迁移的帮助:

def self.up 
    add_column :locations, :old_feed, :string 
    Location.all.each do |l| 
     l.old_feed = l.feed 
     l.feed.sub!(/^.*?(\d+)\.xml$/, 'http://newsrss.bbc.co.uk/weather/forecast/\1/Next3DaysRSS.xml') # l.feed = l.feed.sub(...) does not make it any better 
     l.save! 
    end 
    end 

我想他们变成

... 
*************************** 8. row *************************** 
     id: 8 
     feed: http://newsrss.bbc.co.uk/weather/forecast/4564/Next3DaysRSS.xml 
    old_feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/4564.xml 
... 
*************************** 11. row *************************** 
     id: 11 
     feed: http://newsrss.bbc.co.uk/weather/forecast/5007/Next3DaysRSS.xml 
    old_feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/5007.xml 
... 

我得到的是

... 
*************************** 8. row *************************** 
     id: 8 
     feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/4564.xml 
    old_feed: http://newsrss.bbc.co.uk/weather/forecast/4564/Next3DaysRSS.xml 
... 
*************************** 11. row *************************** 
     id: 11 
     feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/5007.xml 
    old_feed: http://newsrss.bbc.co.uk/weather/forecast/5007/Next3DaysRSS.xml 
... 

看起来像feed和​​以某种方式被交换,我不明白为什么。

Rails 2.3.4,MySQL 5.0。

P.S.
我敢打赌,这是一个愚蠢的明显的东西,我在这里失踪。

+0

什么位置验证?任何重写的setter/getters? – Eimantas 2010-01-12 16:52:19

+1

P.S.我不建议在迁移过程中进行数据更改。你可能想为这个问题设置一个单独的rake任务。 – Eimantas 2010-01-12 16:54:32

+0

没有覆盖的setter/getters – artemave 2010-01-12 17:15:19

回答

2
  1. 您正在修改的同一对象(已经提到)。
  2. feed属性未分配任何新内容。您正在修改返回值到位

这些组合使您看起来像是在反转字符串。有趣的是,实际结果。 :-)

试试这个:

def self.up 
    add_column :locations, :old_feed, :string 
    Location.all.each do |l| 
    l.old_feed = l.feed 
    # Reassign the new feed and drop the ! from sub!() to return a new string. 
    l.feed = l.feed.sub(/^.*?(\d+)\.xml$/, 
     'http://newsrss.bbc.co.uk/weather/forecast/\1/Next3DaysRSS.xml') 
    l.save! 
    end 
end 
1

您在这里修改同一个对象:

l.old_feed = l.feed 
l.feed.sub!(/^.*?(\d+)\.xml$/, 'http://newsrss.bbc.co.uk/weather/forecast/\1/Next3DaysRSS.xml') # l.feed = l.feed.sub(...) does not make it any better 

应该改为:

l.old_feed = l.feed.clone 
l.feed.sub!(/^.*?(\d+)\.xml$/, 'http://newsrss.bbc.co.uk/weather/forecast/\1/Next3DaysRSS.xml') # l.feed = l.feed.sub(...) does not make it any better 
+0

这似乎不能解释为什么feed会保留旧值。 – artemave 2010-01-12 17:12:46

+0

也许有些内部混淆,但问题在于我想。 – 2010-01-12 17:23:49

+0

你说得对。 molf答案解释了为什么饲料保持不变。 – artemave 2010-01-12 17:32:22

相关问题