6

생성하려는 마이 그 레이션에서 테이블의 기본 키는 "id"라는 필드이지만 자동 증가 정수가 아닙니다. 데이터 유형은 uniqueidentifier (uuid) 여야합니다. 내가 시도한 것은 다음과 같습니다.UUID 기본 키가있는 ActiveRecord 마이그레이션

create_table :some_things, :id => false do |t| 
    t.column :id, :uniqueidentifier, :primary => true 
    t.column :name, :string, :limit => 255 
    t.column :type, :tinyint 
    t.column :deleted_flag, :bit 
    t.column :class_id, :uniqueidentifier 
    t.timestamps 
end 

이렇게하면 테이블이 올바르게 생성되지만 기본 키는 없습니다 (왜냐하면 내가 말했기 때문에 : id => false). 내가 "create_table : some_things, : id => true, : primary => : id"라고 말하면 "id"가 기본 키가되지만, 자동 증가가 아닌 정수가 아닌 자동 증가 uuid입니다.

기본 키가 "uniqueidentifier"유형의 "id"라는 필드 (자동 증가가 아닌)가되도록이 마이그레이션 작업을 수행하려면 어떻게해야합니까?

내가 사용하고 있습니다 : SQL 서버 2008, 레일/액티브 3.0.3, 액티브 - SQLSERVER 어댑터 보석, 및 ODBC 연결.

+0

이것은 http://stackoverflow.com/questions/1200568/using-rails-how-can-i-set-my-primary-key-to-not-be-an-integer-typed- 열 - 우리는 질문을 통합해야합니까? –

답변

1

문제를 직접 해결하는 방법을 모르겠지만 해결 방법이 있습니다.

'기본'지침없이 마이그레이션 컬럼 ID를 입력하십시오. 그리고 방법 후 마이그레이션 'CREATE_TABLE는'SQL의 추가 제약 실행

execute "ALTER TABLE some_things ADD PRIMARY KEY (id);" 

(MSSQL을 사용하지 않고 그것을위한 SQL 구문에서 실수가 될 수 있음)

을 추가하여 모델에서

가 기본 키를 정의 나는이 문제를 해결하는 방법

self.primary_key = "id" 

또는

set_primary_key :id 
1

는 여기에 있었다 :

1) 마이 그 레이션에서 ID 및 id_sequence를 자동 생성하도록 마이 그 레이션을 허용하고 여기에 guid라고하는 더미 uuid 열을 추가했습니다. 그것은 개발 경로에 들어가는 가장 쉬운 방법이었습니다. 대한

class Thing < ActiveRecord::Base 
    attr_accessible :name, :description, :guid 
end 

그래서 내가 마이그레이션 후 마이그레이션

class CreateThings < ActiveRecord::Migration 
    def change 
    create_table :things do |t| 
     t.string :name 
     t.string :description 
     t.uuid :guid 

     t.timestamps 
    end 
    end 
end 

2를) 사용, 나는 내가 도움이 개 보석을 사용하고는 SQL 클라이언트

ALTER TABLE things DROP CONSTRAINT things_pkey; 
ALTER TABLE things ADD PRIMARY KEY (guid); 
ALTER TABLE things DROP COLUMN id; 
ALTER TABLE things RENAME COLUMN guid TO id; 

3)를 통해 다음을 실행할 수 있습니다 이와 함께

gem 'uuidtools' 
gem 'postgres_ext' 

분명히, 내 솔루션은 Postgres DB에 대한 것이지만, 문제의 하나, 즉 레일 길이를 유지하기 위해 레일스를 어떻게 사용합니까? 어쨌든 UUIDtools는 DB를 불가지론합니다.

: 내 것 클래스에서

4) 나는이 UUID 단순히 그런데 그렇게

module Extensions 
    module UUID 
    extend ActiveSupport::Concern 

    included do 
     # set_primary_key 'guid' 
     before_create :generate_uuid 

     def generate_uuid 
     self.id = UUIDTools::UUID.random_create.to_s 
     end 
    end 
    end 
end 

같은 모듈

class Thing < ActiveRecord::Base 
    include Extensions::UUID 

어디에 사용,이 취지에 후자의 발견

https://gist.github.com/rmoriz/937739

하지만 내 솔루션은 약간 다릅니다.