我们有script/generate migration add_fieldname_to_tablename fieldname:datatype语法,用于向模型添加新列。
在同一行中,是否有用于更改列的数据类型的脚本/generate ?或者我应该直接将SQL写入我的常规迁移中?
我想将一列从datetime改为date。
我们有script/generate migration add_fieldname_to_tablename fieldname:datatype语法,用于向模型添加新列。
在同一行中,是否有用于更改列的数据类型的脚本/generate ?或者我应该直接将SQL写入我的常规迁移中?
我想将一列从datetime改为date。
当前回答
正如我从前面的答案中发现的,改变列的类型需要三个步骤:
步骤1:
使用下面的代码生成一个新的迁移文件:
rails g migration sample_name_change_column_type
步骤2:
转到/db/migrate文件夹并编辑您创建的迁移文件。有两种不同的解决方案。
def变化 Change_column (:table_name,:column_name,:new_type) 结束
2.
def up
change_column :table_name, :column_name, :new_type
end
def down
change_column :table_name, :column_name, :old_type
end
步骤3:
不要忘记执行以下命令:
rake db:migrate
我已经在Rails 4上测试了这个解决方案,效果很好。
其他回答
正如我从前面的答案中发现的,改变列的类型需要三个步骤:
步骤1:
使用下面的代码生成一个新的迁移文件:
rails g migration sample_name_change_column_type
步骤2:
转到/db/migrate文件夹并编辑您创建的迁移文件。有两种不同的解决方案。
def变化 Change_column (:table_name,:column_name,:new_type) 结束
2.
def up
change_column :table_name, :column_name, :new_type
end
def down
change_column :table_name, :column_name, :old_type
end
步骤3:
不要忘记执行以下命令:
rake db:migrate
我已经在Rails 4上测试了这个解决方案,效果很好。
我不知道您是否可以从命令行创建一个迁移来完成所有这些,但是您可以创建一个新的迁移,然后编辑迁移以执行这个taks。
如果tablename是表的名称,fieldname是字段的名称,并且您希望从一个datetime更改到另一个日期,您可以编写一个迁移来实现这一点。
你可以创建一个新的迁移:
rails g migration change_data_type_for_fieldname
然后编辑迁移,使用change_table:
class ChangeDataTypeForFieldname < ActiveRecord::Migration
def self.up
change_table :tablename do |t|
t.change :fieldname, :date
end
end
def self.down
change_table :tablename do |t|
t.change :fieldname, :datetime
end
end
end
然后运行迁移:
rake db:migrate
Rails 5
来自Rails指南:
如果你希望一个迁移做一些活动记录不知道如何反转的事情,你可以使用可逆:
class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
def change
reversible do |dir|
change_table :tablename do |t|
dir.up { t.change :fieldname, :date }
dir.down { t.change :fieldname, :datetime }
end
end
end
end
你可以使用change_column:
def change
change_column :table_name, :column_name, :new_data_type
end
如果在一个表中有多个列要更改,也可以使用块。
例子:
change_table :table_name do |t|
t.change :column_name, :column_type, {options}
end
有关更多细节,请参阅关于Table类的API文档。