Rails 응용 프로그램에서 긴 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, 임의의 테이블에서 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
데이터베이스 계층의 제한.