在Rails Migration(MySQL)中,你能指定一个新列的位置吗?
如果我通过MySQL添加一列,我可以指定表中列将使用AFTER修饰符的位置。 但是,如果我通过Rails迁移来执行add_column,则该列将在表的末尾创build。
是否有钢轨迁移的任何function来指定添加列的位置?
现在可以在Rails 2.3.6+中通过传递:after参数
对于没有看到这个特性的优点的人来说:你从来不看ORM以外的数据库吗? 如果我在任何types的用户界面中查看,我喜欢把外键,状态栏,标志等全部组合在一起。 这不会影响应用程序,但肯定会加快我的审查数据的能力。
你当然可以。
-
简短的回答:
add_column :users, :gender, :string, **:after => :column_name**
-
很长的回答:
下面是一个例子,假设你想在列“ 用户名 ”后添加一个名为“ 性别 ”的列到“ 用户 ”表。
- types
rails g migration AddGenderToUser gender:string
-
在创build的迁移中添加“ after =>:username ”,使其看起来像这样:
class AddSlugToDictionary < ActiveRecord::Migration def change add_column :users, :gender, :string, :after => :username end end
我创build了一个补丁,将这个附加function添加到ActiveRecord Mysql适配器。 它适用于主和2-3稳定。
它可能是特定于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年代的硬件上才能注意到。