2010-01-12 4 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 и old_feed как-то поменялись местами, и я не могу понять, почему.

Rails 2.3.4, MySQL 5.0.

P.S.
Держу пари, что это что-то глупо очевидно, я здесь отсутствует.

+0

Какова валидация места? Любые переопределенные сеттеры/геттеры? – Eimantas

+1

P.S. Я бы не рекомендовал делать изменения данных при переносе. Возможно, вам захочется создать отдельную граблированную задачу. – Eimantas

+0

Нет перенастраиваемых сеттеров/геттеров – artemave

ответ

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

Это, похоже, не объясняет, почему корм сохраняет старое значение. – artemave

+0

Может быть, некоторые внутренние элементы перепутаны, но проблема там, я думаю. –

+0

Вы правы. molf отвечает, почему корм остался прежним. – artemave

Смежные вопросы