Ruby on Rails:向现有数据库添加列

hel*_*llo 19 ruby migration ruby-on-rails rails-migrations ruby-on-rails-3

我收到一个错误:

SQLite3::SQLException: no such column: ideas.list_id: 
SELECT "ideas".* FROM "ideas"  
WHERE "ideas"."list_id" = 2
Run Code Online (Sandbox Code Playgroud)

但我补充道

t.integer :list_id

到我的数据库迁移文件:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture

      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture
      t.integer :list_id
      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我输入

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

知道为什么我会收到一个错误,说没有列?我还是RoR的新人.我是否必须以其他方式添加列?

谢谢

小智 53

正如Speransky建议的那样,你永远不应该修改旧的迁移文件.相反,您应该创建一个添加所需列的新迁移.例如,在这种情况下,您将在应用程序中运行以下命令来创建新的迁移:

rails generate migration AddListIdColumnToIdeas list_id:integer
Run Code Online (Sandbox Code Playgroud)

Rails会自动生成迁移文件,剩下要做的就是运行rake db:migrate.

如果您坚持修改旧的迁移文件,则可以像添加该列一样添加该列并运行以下命令:

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

这将破坏您当前的数据库,创建一个新数据库并运行所有迁移(包括您的新列).