我收到了一个错误:
SQLite3::SQLException: no such column: ideas.list_id:
SELECT "ideas".* FROM "ideas"
WHERE "ideas"."list_id" = 2
但我添加了
t.integer :list_id
到我的db迁移文件:
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
给了我这个:
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
然后我输入
rake db:migrate
知道为什么我会收到一条错误,说没有列?我还是RoR的新人。我是否必须以其他方式添加列?
由于
答案 0 :(得分:52)
正如Speransky建议的那样,你永远不应该修改旧的迁移文件。相反,您应该创建一个添加所需列的新迁移。例如,在这种情况下,您将在应用程序中运行以下命令以创建新的迁移:
rails generate migration AddListIdColumnToIdeas list_id:integer
Rails会自动生成迁移文件,剩下要做的就是运行rake db:migrate
。
如果您坚持修改旧的迁移文件,可以像以前一样添加列并运行以下命令:
rake db:drop
rake db:create
rake db:migrate
这将破坏您当前的数据库,创建一个新数据库并运行所有迁移(包括您的新列)。
答案 1 :(得分:3)
如果要向现有数据库添加新列,则应使用rails generate migration
。因此,您可以尝试rails generate migration add_list_id_to_ideas list_id:integer
,然后使用rake db:migrate
提交此更改。
答案 2 :(得分:2)
您不应向旧迁移添加新行。迁移是构建数据库的一个步骤。上次执行的迁移次数存储在schema
中,如果您使用rake db:migrate
,则不会运行或重做。如果您之前使用创建表运行迁移,那么您应该创建新的迁移,您可以使用add_column
方法。
答案 3 :(得分:1)
迁移文件名在其名称中编码了日期时间,因此rails运行此迁移,并且除非您执行回滚,否则不再运行它
这里出现了迁移的神奇之处,即使用小步骤构建数据库,因此在运行rake db:migrate之后无需更新迁移,您应该进行新的迁移以执行您想要的数据库模式的更改
从旧的迁移文件中删除添加的行,因为如果您决定回滚此迁移,它可能会引发错误
答案 4 :(得分:1)
Rails 4.0轻松实现添加单列或多列 https://gist.github.com/pyk/8569812
答案 5 :(得分:1)
您也可以这样做..
rails g migration add_column_to_users list_id:string
然后rake db:migrate
用户控制器中的add :list_id
属性;
了解更多详情,请查看http://guides.rubyonrails.org/active_record_migrations.html
答案 6 :(得分:0)
如果您的migrate文件夹中已有文件,您只需添加所需的列(只需键入代码),删除development.sqlite或代表您的db文件的任何文件,然后运行rake db:migrate。 然后它将在表中创建一个带有新列的新sqlite文件,您可以在schema.rb中检查它。
所以,基本上,你所做的一切似乎都很好,除了你没有删除你的数据库文件。 这样做对我来说似乎最简单,尽管你会丢失数据库中的所有文件。如果你只是测试和开发Rails应用程序,这是有效的。 除了我写的内容之外,还有人会评论这种方法是否有问题吗?
编辑:我实际上在这里找到了答案 Editing Existing Rails Migrations is a good idea?