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

yal*_*tar 58 mysql migration ruby-on-rails

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

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

Gab*_*esy 63

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

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

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

  • 此外,例如,`:after =>:id`,你也可以说`:first => true`将它作为第一列插入. (9认同)
  • 如果你想知道为什么这对于在PostgreSQL上运行的迁移不起作用,那是因为[MySQL支持AFTER作为ADD COLUMN选项](https://dev.mysql.com/doc/refman/5.1/en/alter- table.html)和[PostgreSQL没有](http://www.postgresql.org/docs/9.1/static/sql-altertable.html) (7认同)
  • 感谢您提供关心列顺序的正当理由。直到我读了你的答案,我才真正明白。如果我查看 ORM 外部的 db,这通常意味着 SQL 命令行控制台或 UI,我可以在其中随意调整列。没想到这些新奇的 Web UI 东西。:-) (2认同)

Tam*_*iev 27

你当然可以.

这是一个示例,假设您要在" 用户 " 列之后添加名为" gender "的列到" users "表.

  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
    
    Run Code Online (Sandbox Code Playgroud)

  • 你能添加一个链接到官方文档吗? (2认同)

小智 8

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

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

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


Bil*_*win 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
Run Code Online (Sandbox Code Playgroud)