Ruby on rails 3 在Rails迁移中向现有表添加列
我有一个用户模型,它需要一个Ruby on rails 3 在Rails迁移中向现有表添加列,ruby-on-rails-3,Ruby On Rails 3,我有一个用户模型,它需要一个:email列(我忘了在最初的scaffold中添加该列) 我打开迁移文件并添加了t.string:email,做了rake db:migrate,得到了一个NoMethodError。然后我加了一行 add_column :users, :email, :string 再次rakedb:migrate,再次NoMethodError。我在这里漏了一步吗 编辑:这是迁移文件 class CreateUsers < ActiveRecord::Migration
:email
列(我忘了在最初的scaffold中添加该列)
我打开迁移文件并添加了t.string:email
,做了rake db:migrate
,得到了一个NoMethodError
。然后我加了一行
add_column :users, :email, :string
再次rakedb: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
class CreateUsers
完成此操作后,我创建了一个新的迁移,而不是篡改原始迁移,只在向上部分使用add列,在向下部分使用drop列
您可以更改原始文件,如果在这两个文件之间向下迁移,则可以重新运行它,但在这种情况下,我认为这会导致无法正常工作的迁移
正如当前发布的,您正在添加列,然后创建表
如果你改变顺序,它可能会工作。或者,在修改现有迁移时,只需将其添加到创建表中,而不是单独添加列。如果您已经运行了原始迁移(在编辑之前),则需要生成新迁移(
rails generate migration add\u email\u to\u users email:string
即可)。
它将创建一个迁移文件,其中包含以下行:
添加列:用户、电子邮件、字符串
然后执行rakedb:migrate
,它将运行新的迁移,创建新列
如果您还没有运行原始迁移,您可以像您正在尝试的那样编辑它。您的迁移代码几乎是完美的:您只需要完全删除add_列
行(该代码试图在创建表之前向表中添加一列,并且您的表创建代码已经更新为包含t.string:email
。您也可以这样做
rake db:rollback
如果尚未向表中添加任何数据,请通过向迁移文件中添加电子邮件列来编辑迁移文件,然后调用
rake db:migrate
如果您的系统中安装了rails 3.1以后的版本,这将起作用
更简单的方法是更改,让迁移文件中的更改保持原样。
使用
这将回滚上一次迁移并再次迁移。在rails控制台上使用此命令
rails generate migration add_fieldname_to_tablename fieldname:string
及
要运行此迁移要添加列,我只需执行以下步骤:
rails生成迁移将\u fieldname\u添加到\u tablename fieldname:string
备选方案
rails生成迁移addFieldnameToTablename
生成迁移后,编辑迁移并定义要添加该列的所有属性
注意:Rails中的表名始终为复数(以匹配DB约定)使用前面提到的步骤之一的示例-
rails生成迁移addemailtouser
rakedb:migrate
db/schema.rb
中更改架构,在SQL查询中添加所需的列李>
rakedb:schema:load
警告/注意
请记住,运行rakedb:schema:load
会自动清除表中的所有数据您可以通过以下方式回滚上一次迁移:
rake db:rollback STEP=1
或者通过以下方式回滚此特定的迁移
rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>
rakedb:migrate:down版本=
编辑文件,然后再次运行rake db:mirgate。您也可以这样做。。
rails g迁移将列添加到用户电子邮件:string
然后rakedb:migrate
同时在用户控制器中添加:email属性
有关更多详细信息,请查看如果表已存在,还可以使用
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
有时
rails生成迁移add\u email\u to\u users email:string
生成如下迁移
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
end
end
然后运行rake db:migrate
您还可以在迁移中使用特殊方法添加新列:
change_table(:users) do |t|
t.column :email, :string
end
也可以使用列前或列后将列添加到特定位置,如:
rails generate migration add_dob_to_customer dob:date
迁移文件将生成以下代码,但after::email除外。您需要在::email之后或之前添加::email
class AddDobToCustomer < ActiveRecord::Migration[5.2]
def change
add_column :customers, :dob, :date, after: :email
end
end
class AddDobToCustomer
为了清楚起见,我们使用复数?所以它是向用户添加电子邮件,而不是向用户添加电子邮件?正确。Rails中的表名始终为复数(以符合DB约定)。最后一步还可以使用Rails DB:migrate
。是否可以在表中的特定位置创建新列。例如,如果我想在现有“email”字段之后创建新字段“status”?@neeraj您现在可能已经有了答案,但对于其他搜索者,您可以这样做,例如t.string:column_x,limit:10,after::column_y
(至少对于Rails 4),我这样做了,但它没有重做“脚手架”并添加新列。我怎样才能“自动地”做到这一点呢?@John Wooten,你可能想删除脚手架,然后再检查一遍。也要删除相应的迁移。要添加注释:在不更改迁移的情况下更改架构可能会与维护应用程序的其他开发人员产生问题。1)rails是否应生成迁移添加电子邮件到用户电子邮件:string
此操作应在bu之后运行
change_table(:users) do |t|
t.column :email, :string
end
rails generate migration add_dob_to_customer dob:date
class AddDobToCustomer < ActiveRecord::Migration[5.2]
def change
add_column :customers, :dob, :date, after: :email
end
end