Rails 3.1如何使用change_table迁移添加列?

7

我有一个名为profiles的表,其中包含一些列。

现在我希望使用rails 3.1中的change方法向该表添加几个列。我创建了一个包含以下代码的迁移:

def change
  change_table :profiles do |t|
    t.string :photo
    t.string :name
    t.references :user
  end
end

迁移工作完美,但是当我想回滚时出现了问题。
SQLite3::SQLException: duplicate column name: photo: ALTER TABLE "profiles" ADD "photo" varchar(255)

有什么想法吗?
2个回答

6
Rails 3.1自动生成的添加列的迁移格式如下:
class AddColumnToTable < ActiveRecord::Migration
  def change
    add_column :table, :column, :type
  end
end

也许尝试这个语法?

使用add_column添加引用怎么样?我猜可以像这样做:https://dev59.com/2HRB5IYBdhLWcg3w1Kr0#493802 但是直接在迁移中添加会更加灵活。 - martnu
@martnu:添加引用只会向表中添加一个类型为整数的ID字段 - 您可以使用add_column:profiles,:user_id,:integer来复制它。 - sevenseacat
reference 还在 assoc_id 列上添加了一个索引,这非常有用。 - Jeriko
根据来源,没有自动添加此类索引。当然,您可以手动添加一个。 - Binary Phile

1
看起来你需要告诉迁移如何回滚自己:
def change
  change_table :profiles do |t|
    t.string :photo
    t.string :name
    t.references :user
  end

  reversible do |dir|
    dir.down do
      remove_column :profiles, :photo
      remove_column :profiles, :name
      remove_column :profiles, :user_id
    end
  end
end

请查看http://guides.rubyonrails.org/migrations.html#using-reversible以获取更多信息。

或者,您可以尝试使用旧的向上和向下方法,这些方法仍然可用,如下所示:

def up
  change_table :profiles do |t|
    t.string :photo
    t.string :name
    t.references :user
  end
end

def down
  remove_column :profiles, :photo
  remove_column :profiles, :name
  remove_column :profiles, :user_id
end

有关升级/降级的更多信息,请参见:http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接