如果我通过MySQL添加列,我可以指定表中该列将使用AFTER修饰符的位置.但是如果我通过Rails迁移执行add_column,则会在表的末尾创建该列.
rails迁移是否有任何功能来指定添加列的位置?
现在可以通过传递:after参数在Rails 2.3.6+中实现
https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations
对于没有看到使用此功能的优势的所有人:您是否永远不会在ORM之外查看您的数据库?如果我在任何类型的UI中查看,我喜欢将外键,状态列,标志等组合在一起.这不会影响应用程序,但肯定会加快我查看数据的能力.
你当然可以.
简短回答:
add_column :users, :gender, :string, :after => :column_name
答案很长:
这是一个示例,假设您要在" 用户 " 列之后添加名为" gender "的列到" users "表.
类型 rails g migration AddGenderToUser gender:string
在创建的迁移中添加" after =>:username ",如下所示:
class AddSlugToDictionary < ActiveRecord::Migration def change add_column :users, :gender, :string, :after => :username end end
我创建了一个补丁,将这些附加功能添加到ActiveRecord Mysql适配器.它适用于主人和2-3稳定.
https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations
它可能是特定于mysql的,但它不会使您的迁移变得不那么便携(其他适配器只会忽略额外的定位选项).
add_column
迁移中的方法似乎没有位置选项.但迁移支持执行文字SQL.我不是Rails开发人员,但是类似于以下内容:
class AddColumnAfterOtherColumn < ActiveRecord::Migration def self.up execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER AFTER other_column" end def self.down remove_column :table_name, :column_name end end