Пахнет как ActiveRecord портит атрибуты объекта при сохранении - PullRequest
0 голосов
/ 12 января 2010

У меня есть куча записей в таблице locations:

...
*************************** 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.

приписка
Могу поспорить, что это что-то глупо очевидно, что я здесь скучаю.

Ответы [ 2 ]

2 голосов
/ 12 января 2010
  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 голос
/ 12 января 2010

Вы модифицируете тот же объект здесь:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...