如果我通过 MySQL 添加一列,我可以指定该列在表中的哪个位置使用 AFTER 修饰符。但是,如果我通过 Rails 迁移执行 add_column,则该列将在表的末尾创建。
rails迁移是否有任何功能来指定添加列的位置?
如果我通过 MySQL 添加一列,我可以指定该列在表中的哪个位置使用 AFTER 修饰符。但是,如果我通过 Rails 迁移执行 add_column,则该列将在表的末尾创建。
rails迁移是否有任何功能来指定添加列的位置?
现在可以通过传递 :after 参数在 Rails 2.3.6+ 中实现
对于没有看到拥有此功能的优势的每个人:您从不在 ORM 之外查看您的数据库吗?如果我在任何类型的 UI 中查看,我喜欢将外键、状态列、标志等所有内容组合在一起。这不会影响应用程序,但肯定会加快我查看数据的能力。
你当然可以。
简短的回答:
add_column :users, :gender, :string, :after => :column_name
长答案:
这是一个示例,假设您要在“ users ”表的“ username ”列之后添加一个名为“ gender ”的列。
rails g migration AddGenderToUser gender:string
在创建的迁移中添加“ after => :username ”,如下所示:
class AddSlugToDictionary < ActiveRecord::Migration
def change
add_column :users, :gender, :string, :after => :username
end
end
我创建了一个补丁,将这个附加功能添加到 ActiveRecord Mysql 适配器。它适用于master和2-3-stable。
它可能是特定于 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 中无法指定列的位置。事实上,我认为列是按照它们在迁移中的命名顺序创建的只是巧合(因此不能依赖)。
表中列的顺序几乎是相关的,应该如此:给出的常见“原因”是在执行“SELECT *”时能够看到特定的子集,但这确实不是一个好的理由。
任何其他原因都可能是设计气味,但我很想知道我错的正当理由!
在某些平台上,通过将最有可能为 NULL 的列放在末尾可以获得(微小的)空间和性能节省(因为 DMBS 不会将任何磁盘空间用于“尾随”NULL 值,但我认为您必须在 1980 年代的硬件上运行才能注意到。