web-dev-qa-db-ja.com

Railsアプリケーションで長いIDを使用するには?

ActiveRecordのIDの(デフォルト)タイプを変更するにはどうすればよいですか? intは十分な長さではありません。移行のための:longがないことに驚きました-いくつかの小数点を使用しますか?

38
Björn

クレジット 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フィールドの自動作成を無効にするオプション:id => falseを参照してください
  • t.integer :id, :limit => 8行は64ビット整数フィールドを生成します
49
Notinlist

デフォルトの主キーカラムタイプを設定するには、移行ファイルをいじる場所ではありません。

代わりに、これを_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
_
43
choonkeat

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では、さらに注意する必要があります。

7
Luke Francl

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列を使用します。

6
Yehuda Katz

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データベース接続を確立するまで必要ありません。

5
Brandan

Rails4では、それを行うことができます。

以下は、Rails4Dummypostgresモデルを作成する例です。

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

何をしたか:

  • 64ビット整数のidタイプとしてserial8を使用し、primary keyとして定義します。
  • タイムゾーン情報を含むtimestamptzを日時タイプとして使用します。これは、複数のタイムゾーンにまたがるアプリケーションにとって重要です。
4
Eric Wang

Rails 3、MySQL:

t.column :foobar, :int, :limit => 8

私にbigintを与えず、intだけを与えます。しかしながら、

t.column :Twitter_id, 'bigint'

正常に動作します。 (ただし、MySQLに関連付けられています)。

2
Duke

他のソリューションを借用し、最近うまくいったことに合わせて調整しました。

_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
_
2
z5h

移行で使用されるデータ型を変更できる 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 [〜#〜] を参照してください。

0
Gary S. Weaver

あなたはこのようにそれを行うことができます:

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users, id: :bigserial do |t|
      t.string :name
    end
  end
end
0
Alexander Gorg