2012-07-30 6 views
1

웹 응용 프로그램의 테이블에는 "GUID"ID가 ID 필드에 있습니다. DB를 만드는 데 사용 된 실제 SQL 코드를 조사하여 ID가 ​​실제로 기본 키로 지연되지 않는 것을 확인했습니다. 고유성이 적용되지 않고 색인이 작성되지 않습니다.RoR 스키마에 기본 키 제약 조건 추가

이렇게하면 좋지 않을 수 있습니다. 우리의 목표는 여기에

개발에
create_table "projects", :id => false, :force => true do |t| 
    t.string "id" 
    t.string "name" 
    t.string "objective" 
    t.datetime "created_at",        :null => false 
    t.datetime "updated_at",        :null => false 
    t.string "client_account_id" 
    t.string "default_project_name" 
    t.boolean "quota_exceeded",  :default => false, :null => false 
    end 

, 우리는 sqlite3를 데이터베이스를 사용하는 생산에, 우리가 의존하는 동안 우리의 schema.rb의 샘플입니다 "기본 키"우리의 ID 필드를 설정하는 것입니다 MySQL에.

기존 SQLite3 DB에 이러한 제약 조건을 추가 할 수 없다는 것을 알고 있지만 필요하다면 삭제하고 다시 만들 준비가되었습니다. 가능하면 MySQL DB를 삭제하는 것을 피하고 싶지만 실제로 필요한 경우 백업하고 새 스키마에 데이터를 삽입 할 수 있습니다.

최선의 방법은 무엇입니까? (레일 V3.2.6)

답변

0

당신은 이미 그랬던 것처럼 당신이 당신의 마이그레이션 사용에서 composite_primary_keys gem

살펴해야 레일의 표준이 아닌 기본 키를 설정하려면,

:id => false 

그런 다음 모델의 보석이 사용하려는 키가 생성 문에 의해 설정되는 수 있도록 기본 레일 동작을 오버라이드 (override)되어 다음

require 'composite_primary_keys' 
class User < ActiveRecord::Base 
    self.primary_keys = :your_custom_id 
end 

을 시도합니다. 원하는 경우 복합 기본 키를 사용할 수도 있습니다.

validates_uniqueness_of :your_id, :message => "ID needs to be unique" 
:

또 다른 방법은 그냥 uniquness을 확인하려는 경우, 당신은이 같은 액티브 검증을 사용할 수 있습니다

create_table "projects", :primary_key => 'your_id' do 
    ... 
end 

또는

마이그레이션에 :primary_key 옵션을 사용하는 것입니다

희망이 도움이됩니다.

+0

이 방법이 실제 복합 키에 유용 할 수 있음을 이해합니다. 그러나 제 상황에서는 어떻게 사용합니까? : validate_uniqueness_of : id? 가능하면 모델 수준이 아닌 DB 수준에서 고유성을 적용하고 싶습니다. – almathie

관련 문제