Ruby on rails 闻起来好像ActiveRecord在保存时弄乱了对象属性
我在Ruby on rails 闻起来好像ActiveRecord在保存时弄乱了对象属性,ruby-on-rails,activerecord,migration,Ruby On Rails,Activerecord,Migration,我在位置表中找到了一堆记录: ... *************************** 8. row *************************** id: 8 feed: http://feeds.bbc.co.uk/weather/feeds/rss/5day/world/4564.xml ... *************************** 11. row *************************** id: 1
位置
表中找到了一堆记录:
...
*************************** 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
和old_feed
不知怎么被替换了,我不知道为什么
Rails 2.3.4、MySQL 5.0
附加说明我敢打赌,我在这里遗漏了一些非常明显的东西。您在这里修改的是同一个对象:
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
您正在此处修改同一对象:
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
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
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
什么是位置验证?任何被重写的setter/getter?请注意,我不建议在迁移中进行数据更改。您可能需要为此设置一个单独的rake任务。验证\u存在性\u:name,:feed,:tz验证\u唯一性\u:name,:feed什么是位置验证?任何被重写的setter/getter?请注意,我不建议在迁移中进行数据更改。您可能需要为此设置一个单独的rake任务。验证存在性验证唯一性验证feed保留旧值的原因。可能是一些内部错误,但我认为问题在于此。您是对的。molf的回答解释了为什么feed保持不变。这似乎并不能解释feed为什么保留旧的价值。也许一些内部的东西弄混了,但我认为问题就在那里。你是对的。molf的回答解释了为什么feed保持不变。