铁路迁移奇怪

时间:2010-12-17 01:51:10

标签: ruby-on-rails sqlite migration

这是我的迁移:

  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

由于某些原因,当它运行时,feature属性不会被保存。如果我从控制台运行它,它没有问题。

我注意到的另一个奇怪的事情是,如果我在列重置后使迁移失败,然后修复它以使其完成,那么当我重新运行它时它会起作用。

当上面的代码第一次运行时,这是日志输出......

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

任何想法?

1 个答案:

答案 0 :(得分:0)

这是一种结束,但运行这样的事情应该快得多:

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

这并不能解释您所看到的奇怪行为,但如果您拥有大量用户,则应该证明它的速度要快得多(并且RAM密集度较低)。