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保持不变。