2010-12-17 90 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