どのように使idのレール。
-
21-08-2019 - |
質問
変更するには、どうすればいいで(デフォルトの)タイプActiveRecordのId?intではないが、好みの長さです。ることには驚きはありません:長のための移動でなただけの一点?
解決
単位 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
を無効に自動作成のidフィールド - の
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
更新:@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
私はあなたのデータベースは、あなたが(例えば、「unsigned long型」)を使用するデータベースのカラム型のために使用する任意のテキストを置くことができる「BIGINT」を持っているところます。
あなたがBIGINTであるためにあなたのidカラムが必要な場合は、、それを行うための最も簡単な方法はchange_columnと同じ移行に列を変更、その後、テーブルを作成することです。
PostgreSQLとSQLiteのでは、スキーマの変更はアトミックですので、移行が失敗した場合、これは奇妙な状態でデータベースを残すことはありません。 MySQLのを使用すると、より注意する必要があります。
RailsのAPIドキュメントによると、タイプのための可能なオプションがあります:
:string
:text
:integer
:float
:decimal
:datetime
:timestamp
:time
:date
:binary
:boolean
小数の、またはあなたがする必要がある場合は、直接コマンドを実行することができます:あなたは使用することができます。
class MyMigration
def self.up
execute "ALTER TABLE my_table ADD id LONG"
end
end
wapposが指摘したように、あなたのような補助のオプションを使用することができます:あなたは、列になりたいどのように大規模なActiveRecordのを伝えるために制限。大きなと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
, できます。
以下の例の作成 Dummy
モデル rails4
& 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
う:
- Itの使用
serial8
idとしている64ビット整数で指定することができましprimary key
. - Itの使用
timestamptz
としてのdatetimeのタイプのタイムゾーン情報において、このことを理由に、不必要なアプリを複数タイムゾーン.
の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すると呼ばれる宝石を書きましたあなたの移行インチ
あなたの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
デフォルトのprimary key
の列の種類を変更する方法に修正ます:
の代わりに:
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
あなたが行う必要があります:
ActiveRecord::ConnectionAdapters::MysqlAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "BIGINT(8) UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY"
や他のデータベース層にforeign key
の制限を追加することはできません。