2010-12-17 88 views
0

這裏是我的移民:軌道遷移古怪

class Avatar < ActiveRecord::Base 
    end 

    def self.up 
    add_column :users, :featured,   :boolean, :default => false, :null => false 

    User.reset_column_information 

    Avatar.all.each do |a| 
     user = User.find(a.user_id) 
     user.featured = a.featured 
     user.save 
    end 

    drop_table :avatars 
    end 

由於某種原因在運行時,該功能的屬性沒有得到保存。如果我從控制檯運行它,它沒有問題。

我注意到的另一個奇怪的事情是,如果我在列重置之後使遷移失敗,然後修復它使其完成,那麼當我重新運行它時,它將起作用。

當上面的代碼運行的是第一次,這是日誌輸出

...

Migrating to MoveAvatarsToProfile (20101216003815) 
** ActionMailerWithRequest: initialized properly 
    [1m[36mSQL (0.5ms)[0m [1m SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
[0m 
    [1m[35mSQL (0.4ms)[0m SELECT name 
FROM sqlite_master 
WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
    [1m[36mSQL (0.3ms)[0m [1mSELECT "schema_migrations"."version" FROM "schema_migrations"[0m 

什麼想法?

+0

Rails + Ruby版本?另外,如果你使用爆炸版本('user.save!'),有什麼錯誤? – Zabba 2010-12-17 02:16:43

+0

沒有錯誤,但也沒有保存 – brewster 2010-12-17 02:41:03

回答

0

這是一種一結束,各地,但它應該是更快的運行是這樣的:

User.execute("UPDATE users 
       SET users.featured = avatars.featured 
       WHERE users.id = avatars.user_id") 

這並不能說明你看到的奇怪的行爲,但如果你有很多的用戶,它應該證明一個明顯更快(並且內存更小的解決方案)。

+0

是啊我沒有那麼多的用戶,這只是一次,我的遷移後運行,所以我可以在我移植後在控制檯中手動執行...但它的更多在這一點上爲我學習的經驗,並找出原因!我需要理解! – brewster 2010-12-18 01:11:21