Add_column迁移列顺序

时间:2015-08-03 10:03:10

标签: ruby-on-rails migration

我使用Rails 4,SQLite版本3.8.2,我想在我的数据库中添加新列。 我创建了新的迁移:

public class DecimalDigitsInputFilter implements InputFilter {

private final Pattern mPattern;

public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
    mPattern = Pattern.compile(String.format("[0-9]{0,%d}(\\.[0-9]{0,%d})?", digitsBeforeZero, digitsAfterZero));
}

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    Matcher matcher = mPattern.matcher(createResultString(source, start, end, dest, dstart, dend));
    if (!matcher.matches())
        return "";
    return null;
}

private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String sourceString = source.toString();
    String destString = dest.toString();
    return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}

所以我得到了:

rails g migration AddFooToStudents foo:string

然后我运行迁移:

class AddFooToStudents < ActiveRecord::Migration
  def change
    add_column :students, :foo, :string, after: :name
  end
end
Everythink似乎没问题,在数据库中添加了foo列,而不是在name列之后,它已添加到表的末尾

rake db:migrate

== 20150803095305 AddFooToStudents: migrating
=================================
-- add_column(:students, :foo, :string, {:after=>:name})
-> 0.0009s
== 20150803095305 AddFooToStudents: migrated (0.0011s)
========================

我完全不知道自己做错了什么

2 个答案:

答案 0 :(得分:2)

您正在使用after选项,因此您可以合理地期望它将其放在:name之后。

但是,这没有很好地记录(如果有的话),但after选项仅适用于某些DBMS(可能只有MySQL)。

我做的是在add_column调用之后添加我自己的sql来执行此操作,如下所示:

add_column :students, :foo, :string
ActiveRecord::Base.connection.execute("ALTER table students MODIFY COLUMN foo varchar(255) AFTER name")  

您的SQL需要特定于DBMS,即针对MySql,PostGresql,SQLite等进行定制。

答案 1 :(得分:0)

好吧,SQLite不处理AFTER语法,因此在这种情况下,最好的解决方案是保持列的顺序不变或创建新表。