在Rails迁移中将列添加到现有表中
我有一个用户模式,需要一个:email
列(我忘了在最初的脚手架期间添加该列)。
我打开迁移文件并添加了t.string :email
,做了rake db:migrate
,并且得到了一个NoMethodError
。 然后我添加了这一行
add_column :users, :email, :string
再次rake db:migrate
,再次NoMethodError
。 我在这里错过了一步吗?
编辑:这是迁移文件。
class CreateUsers < ActiveRecord::Migration def self.up add_column :users, :email, :string create_table :users do |t| t.string :username t.string :email t.string :crypted_password t.string :password_salt t.string :persistence_token t.timestamps end end def self.down drop_table :users end end
如果你已经运行了原始的迁移(编辑之前),那么你需要生成一个新的迁移( rails generate migration add_email_to_users email:string
将做的伎俩)。 然后做一个rake db:migrate
,它会运行新的迁移。
如果您尚未运行原始迁移,则可以对其进行编辑,就像您正在尝试的那样。 您的迁移代码几乎是完美的:您只需要完全删除add_column
行(在创build表之前,代码正试图向表中添加一列,并且您的表创build代码已经更新为包含t.string :email
)。
在rails控制台上使用这个命令rails generate migration add_fieldname_to_tablename fieldname:string
和
rake db:migrate
来运行这个迁移
你也可以做
rake db:rollback
如果您尚未将任何数据添加到表中,请通过向其添加电子邮件列来编辑迁移文件,然后调用
rake db:migrate
如果您的系统中安装了rails 3.1或更高版本,这将起作用。
更简单的方法是更改迁移文件的更改。 使用
$rake db:migrate:redo
。
这将回滚上次迁移并再次迁移。
要添加一列,我只需要按照下面的步骤:
-
rails generate migration add_fieldname_to_tablename fieldname:string
替代
rails generate migration addFieldnameToTablename
一旦迁移生成,然后编辑迁移并定义所需的列添加的所有属性。
注意 :Rails中的表名总是复数(与DB约定匹配)。 使用前述步骤之一的示例 –
rails generate migration addEmailToUsers
-
rake db:migrate
要么
- 您可以从
db/schema.rb
更改模式,在SQL查询中添加所需的列。 -
运行这个命令:
rake db:schema:load
警告/注意事项
请记住,运行
rake db:schema:load
自动清除表中的所有数据。
当我这样做了,而不是摆弄原来的迁移,我创build一个新的只有在上一节添加列和下降部分的一个下降列。
你可以改变原来的,并重新运行,如果你之间迁移,但在这种情况下,我认为这是一个迁移,将无法正常工作。
正如目前发布的那样,您正在添加该列,然后创build该表。
如果您更改订单,它可能会工作。 或者,在修改现有迁移时,只需将其添加到创build表中,而不是单独添加列。
你可以回滚最后一次迁移
rake db:rollback STEP=1
或者通过回滚这个特定的迁移
rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>
并编辑文件,然后再运行rake db:mirgate
。
你也可以这样做。rails g migration add_column_to_users email:string
然后rake数据库:迁移也添加:在您的用户控制器的电子邮件属性;
有关更多详细信息,请访问http://guides.rubyonrails.org/active_record_migrations.html
你也可以使用force: true
表中的表列force: true
,如果你的表已经存在。
例如 :
ActiveRecord::Schema.define(version: 20080906171750) do create_table "authors", force: true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" end end