代码之家  ›  专栏  ›  技术社区  ›  yalestar

在Rails迁移(MySQL)中,能否指定新列的位置?

  •  50
  • yalestar  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  69
  •   Gabe Martin-Dempesy    14 年前

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

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

    对于那些没有看到拥有这个特性的好处的人来说:你从不在ORM之外查看你的数据库吗?如果我在任何类型的UI中查看,我喜欢将外键、状态列、标志等都分组在一起。这不会影响应用程序,但肯定会加快我查看数据的速度。

        2
  •  32
  •   Manish Shrivastava Gambai    5 年前

    当然可以。

    • 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
      
        3
  •  8
  •   Ben Marini    15 年前

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

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

        4
  •  5
  •   Bill Karwin    16 年前

    似乎没有一个职位的选择 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
    
        5
  •  1
  •   Mike Woodhouse    16 年前

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

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

    任何其他原因都可能是设计的味道,但我想知道我错的一个有效原因!