문제

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, 임의의 테이블에서 1 차 키에 임의의 열을 사용하려면 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

레일이 자동으로 넣기 때문에 마이그레이션으로 기본 키를 설정하기가 어렵습니다.

다음과 같이 나중에 열을 변경할 수 있습니다.

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"가있는 경우 사용하려는 데이터베이스 열 유형에 데이터베이스가 사용할 텍스트를 넣을 수 있습니다 (예 : "부호없는 긴").

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가 지적했듯이 다음과 같은 보조 옵션을 사용할 수 있습니다. Limit ActivereCord에 열이 얼마나 큰지 알려줍니다. 따라서 : int 열을 더 큰 다음으로 사용합니다 : 한계.

PostgreSQL과 함께 작동하기 위해 누군가가 필요한 경우 다음과 같은 이니셜 라이저를 작성하십시오.

# config/initializers/bigint_primary_keys.rb
ActiveRecord::Base.establish_connection
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = 'bigserial primary key'

레일 3.2 (그리고 아마도 이전 버전)의 게으른 하중으로 인해 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 데이터베이스 연결을 설정할 때까지 필요하지 않습니다.

~ 안에 rails4, 할 수 있어요.

다음은 a를 작성하는 예입니다 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

그 일 :

  • 사용합니다 serial8 64 비트 정수 인 ID 유형으로 primary key.
  • 사용합니다 timestamptz 시간대 정보가 포함 된 DateTime 유형으로서 여러 시간을 가로 지르는 응용 프로그램에 중요합니다.

Rails 3, MySQL :

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

나에게 큰 것을주지 않고 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'

그런 다음 postgres에서 긴 ID를 사용하려면 config/Environment.rb에서 다음을 추가하십시오.

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 데이터베이스 계층의 제한.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top