2

テーブルusersを作成したとき、結果のテーブルには、整数として定義されたidという列がありました。

次のように、符号なしのbigintに変更しようとしました。

change_column :users, :id, :integer, :limit => 8, :unsigned => true

これによりbigintに変更されましたが、自動インクリメント列ではなくなりました(ただし、プライマリインデックスとして識別され、unsignedに設定されていませんでした(railsから移行が正常に実行されたと通知された場合でも)

次に、次のことを試してみました。

change_column :users, :id, :integer, :limit => 8, :unsigned => true, :null => false, :auto_increment => true

Railsによると、移行は正常に実行されましたが、何も変更されていません。

私は次のようなことを試すことができます:

change_column :users, :id, :primary_index

しかし、それは私が始めたところに私を正しく置くでしょう

MySQLコードで「execute」ステートメントを試すこともできますが、移行ファイルを「クリーン」に保ちたいと思います。誰かがこの問題に遭遇しましたか?

余談ですが、別の列でデフォルトをNULLに設定しようとして、ここ(およびGoogle)で調査しましたが、成功しませんでした。

編集:

一般的な移行によるテーブル作成の一部として作成された列「id」を編集する方法がないようです。これを行う唯一の方法は、MySQL構文を使用した「execute」ステートメントを使用することです。

4

2 に答える 2

1

この移行を作成して実行してみてください。

class ChangeColumnUserIdToAutoIncrement < ActiveRecord::Migration

  def self.up
    execute "ALTER TABLE users modify COLUMN id int(8) AUTO_INCREMENT"
  end

  def self.down
    execute "ALTER TABLE users modify COLUMN id int(8)"
  end
end
于 2013-08-20T19:11:16.920 に答える
0

Railsは、作成しているすべてのテーブルのIDフィールドを処理し、移行やschema.rbファイルからも非表示になります。

だから私はあなたに一歩下がって考えるようにアドバイスします:なぜあなたはそれを台無しにしたいのですか?それが本当に必要なのですか?

編集:この答えはまさにあなたが探しているもののようです。

「デフォルトをNULLに設定する」に関しても、なぜそうするのですか?とにかく、すべての列はデフォルトでNULLになっています。ただし、そうでない場合は、移行でそれを行うことができます。

change_table :users do |t|
  t.string :description, :default => nil
end

それがあなたの質問に答えることを願っています。

于 2012-06-01T11:15:38.683 に答える