63

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

rails迁移是否有任何功能来指定添加列的位置?

4

5 回答 5

69

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

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

对于没有看到拥有此功能的优势的每个人:您从不在 ORM 之外查看您的数据库吗?如果我在任何类型的 UI 中查看,我喜欢将外键、状态列、标志等所有内容组合在一起。这不会影响应用程序,但肯定会加快我查看数据的能力。

于 2010-07-14T22:17:43.230 回答
32

你当然可以。

  • 简短的回答:

    add_column :users, :gender, :string, :after => :column_name
    
  • 长答案:

这是一个示例,假设您要在“ users ”表的“ username ”列之后添加一个名为“ gender ”的列。

  1. 类型rails g migration AddGenderToUser gender:string
  2. 在创建的迁移中添加“ after => :username ”,如下所示:

    class AddSlugToDictionary < ActiveRecord::Migration
      def change
        add_column :users, :gender, :string, :after => :username
      end
    end
    
于 2012-03-30T15:47:06.620 回答
8

我创建了一个补丁,将这个附加功能添加到 ActiveRecord Mysql 适配器。它适用于master和2-3-stable。

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

它可能是特定于 mysql 的,但它不会降低迁移的可移植性(其他适配器只会忽略额外的定位选项)。

于 2009-10-04T20:28:23.367 回答
5

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
于 2008-12-16T17:02:27.690 回答
1

Rails 中无法指定列的位置。事实上,我认为列是按照它们在迁移中的命名顺序创建的只是巧合(因此不能依赖)。

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

任何其他原因都可能是设计气味,但我很想知道我错的正当理由!

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

于 2008-12-16T17:49:33.430 回答