在Rails Migration(MySQL)中,您可以指定新列的位置吗?

时间:2008-12-16 16:17:15

标签: mysql ruby-on-rails migration

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

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

5 个答案:

答案 0 :(得分:59)

现在可以通过传递:after参数

在Rails 2.3.6+中实现

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

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

答案 1 :(得分:23)

当然可以。

  • 简短回答:

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

以下是一个示例,我们假设您要添加名为" 性别"的列。在列" 用户名"之后到" 用户"表

  1. 输入rails g migration AddGenderToUser gender:string
  2. 在=>之后添加" :用户名"在创建的迁移中,它看起来像这样:

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

答案 2 :(得分:8)

我创建了一个补丁,将此附加功能添加到ActiveRecord Mysql适配器。它适用于主人和2-3稳定。

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

它可能是特定于mysql的,但它不会使您的迁移变得不那么便携(其他适配器只会忽略额外的定位选项)。

答案 3 :(得分: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

答案 4 :(得分:1)

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

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

任何其他原因可能都是一种设计气味,但我很想知道为什么我错了!

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