ActiveRecordのIDの(デフォルト)タイプを変更するにはどうすればよいですか? intは十分な長さではありません。移行のための:longがないことに驚きました-いくつかの小数点を使用しますか?
クレジット http://moeffju.net/blog/using-bigint-columns-in-Rails-migrations
class CreateDemo < ActiveRecord::Migration
def self.up
create_table :demo, :id => false do |t|
t.integer :id, :limit => 8
end
end
end
:id => false
を参照してくださいt.integer :id, :limit => 8
行は64ビット整数フィールドを生成しますデフォルトの主キーカラムタイプを設定するには、移行ファイルをいじる場所ではありません。
代わりに、これを_config/environment.rb
_の下部に貼り付けてください。
_ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
_
そして、すべてのテーブルは、id
の目的の列タイプで作成する必要があります。
_+--------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
_
あなたがやろうとしていることを実行した後...次の質問はおそらく「外部キー列を同じ列型にするにはどうすればよいですか?」主キー_people.id
_をbigint(20) unsigned
として使用しても意味がないため、_person_id
_をint(11)
にするか、他に何をしますか?
これらの列については、他の提案を参照できます。
_t.column :author_id, 'BIGINT UNSIGNED'
t.integer :author_id, :limit => 8
_
[〜#〜] update [〜#〜]:@Notinlist、任意のテーブルの主キーに任意の列を使用するには、_create_table-change_column
_ダンスを実行する必要があります。
_create_table(:users) do |t|
# column definitions here..
end
change_column :users, :id, :float # or some other column type
_
例えば自動インクリメント整数の代わりにguid
が必要な場合、
_create_table(:users, :primary_key => 'guid') do |t|
# column definitions here..
end
change_column :users, :guid, :string, :limit => 36
_
Railsは自動的にそれを置くので、これはマイグレーションで主キーに設定するのが難しいです。
次のように、後で任意の列を変更できます。
change_column :foobars, :something_id, 'bigint'
次のように、初期移行で非プライマリIDをカスタムタイプとして指定できます。
create_table :tweets do |t|
t.column :Twitter_id, 'bigint'
t.column :Twitter_in_reply_to_status_id, 'bigint'
end
「bigint」がある場合は、使用するデータベースの列タイプにデータベースで使用する任意のテキストを入力できます(たとえば、「unsigned long」)。
Id列をbigintにする必要がある場合、最も簡単な方法は、テーブルを作成してから、change_columnを使用して同じ移行で列を変更することです。
PostgreSQLとSQLiteでは、スキーマの変更がアトミックであるため、移行が失敗した場合でもデータベースが変な状態になることはありません。 MySQLでは、さらに注意する必要があります。
Rails APIドキュメントによると、typeに可能なオプションは次のとおりです:
:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean
:decimalを使用できます。または、必要に応じてコマンドを直接実行できます。
class MyMigration
def self.up
execute "ALTER TABLE my_table ADD id LONG"
end
end
Wapposが指摘したように、:limitなどの補助オプションを使用して、列の大きさをActiveRecordに伝えることができます。したがって、より大きな:limitを指定して:int列を使用します。
PostgreSQLを操作するためにこれが必要な場合は、次のような初期化子を作成します。
# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'
Rails 3.2(およびおそらく以前のバージョン))での遅延読み込みのため、ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
データベース接続を確立するまで必要ありません。
Rails4
では、それを行うことができます。
以下は、Rails4
&Dummy
にpostgres
モデルを作成する例です。
xxx_migrate_dummies.rb:
class CreateDummies < ActiveRecord::Migration
def change
create_table :dummies, :id => false do |t|
t.column :id, :serial8, primary_key: true
t.string :name, :limit => 50, null: false
t.integer :size, null: false
t.column :create_date, :timestamptz, null: false
end
end
end
何をしたか:
serial8
を使用し、primary key
として定義します。timestamptz
を日時タイプとして使用します。これは、複数のタイムゾーンにまたがるアプリケーションにとって重要です。Rails 3、MySQL:
t.column :foobar, :int, :limit => 8
私にbigintを与えず、intだけを与えます。しかしながら、
t.column :Twitter_id, 'bigint'
正常に動作します。 (ただし、MySQLに関連付けられています)。
他のソリューションを借用し、最近うまくいったことに合わせて調整しました。
_config/initializers
_のファイルに追加します。新しい列の型を宣言します(chookeatの提案から採用)。
ActiveRecord::ConnectionAdapters::Mysql2Adapter::NATIVE_DATABASE_TYPES[:long_primary_key] = "BIGINT(20) DEFAULT NULL auto_increment PRIMARY KEY"
長いIDを使用する移行は次のとおりです。
_ create_table :notification_logs, :id => false do |t|
t.column :id, :long_primary_key
# ...
end
_
移行で使用されるデータ型を変更できる activerecord-native_db_types_override と呼ばれるgemを書きました。
Gemfileに次を追加します。
gem 'activerecord-native_db_types_override'
次に、config/environment.rbで、postgresで長いIDを使用するには、以下を追加します。
NativeDbTypesOverride.configure({
postgres: {
primary_key: { name: "bigserial primary key"}
}
})
最新情報については [〜#〜] readme [〜#〜] を参照してください。
あなたはこのようにそれを行うことができます:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users, id: :bigserial do |t|
t.string :name
end
end
end