在Rails Migration(MySQL)中,你能指定一个新列的位置吗?

如果我通过My​​SQL添加一列,我可以指定表中列将使用AFTER修饰符的位置。 但是,如果我通过Rails迁移来执行add_column,则该列将在表的末尾创build。

是否有钢轨迁移的任何function来指定添加列的位置?

现在可以在Rails 2.3.6+中通过传递:after参数

https://rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

对于没有看到这个特性的优点的人来说:你从来不看ORM以外的数据库吗? 如果我在任何types的用户界面中查看,我喜欢把外键,状态栏,标志等全部组合在一起。 这不会影响应用程序,但肯定会加快我的审查数据的能力。

你当然可以。

  • 简短的回答:

     add_column :users, :gender, :string, **:after => :column_name** 
  • 很长的回答:

下面是一个例子,假设你想在列“ 用户名 ”后添加一个名为“ 性别 ”的列到“ 用户 ”表。

  1. typesrails g migration AddGenderToUser gender:string
  2. 在创build的迁移中添加“ after =>:username ”,使其看起来像这样:

     class AddSlugToDictionary < ActiveRecord::Migration def change add_column :users, :gender, :string, :after => :username end end 

我创build了一个补丁,将这个附加function添加到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 

Rails没有办法指定列的位置。 实际上,我认为这只是巧合(因此不能被依赖),即按照在迁移中命名的顺序创build列。

表中列的顺序几乎是相关的,应该如此:给出的常见“原因”是在执行“SELECT *”时能够看到特定的子集,但这不是一个好的理由。

任何其他原因可能是一个devise的气味,但我想知道为什么我错了有效的原因!

在某些平台上,通过将NULL的可能性最高的列放到最后(因为DMBS不会使用任何磁盘空间来“拖尾”NULL值,所以可以获得(小型)空间和性能节省,但是我认为你必须运行在1980年代的硬件上才能注意到。