2

편집 :레일 마이그레이션도 외래 키를 기본 키를 확인

내가 열이 기본 키 및보기의 레일 '지점에서 외래 키가되고 싶어요. 즉 references 메서드를 사용하는 외래 키입니다. 내가 좋아하는 일을하고 싶습니다 :

def change 
    create_table :VipPerson, id: false do |t| 
    t.primary_key :person_id 
    t.references :person, :id, column: :person_id 

    t.timestamps 
    end 
end 

가 나는 또한 (아래 참조) 사람 모델을 가리 키도록 레일 모델에 사용되는 사용자 정의 기본 키를 갖고 싶어. 이것은 실제로 SQL 데이터베이스에 의해 사용되는 외래 키와 관련이 없습니다 (Rails는 Demi Magus가 지적한 Rails 4.2까지 실제 외래 키 작성을 지원하지 않았습니다).

-

내 레일 프로젝트에 여러 테이블 Interitance (MTI)를 실현하고 일반적으로 관계형 데이터베이스에서처럼, 따라서 상속을 실현하려는

: 나는 쓸 필요가 이것에 대한 그래서

table: Person 
------------- 
(PK) ID 
Name 
... 

table: VipPerson (specalization of Person) 
---------------- 
(PK) (FK) Person_ID 
VIP-Status 
... 

속성 (여기서 Person_ID)을 (사용자 지정) 기본 키와 외래 키로 동시에 선언하는 마이그레이션입니다. 필자는 Rails의 마이그레이션 DSP 방법으로이 작업을 수행하는 방법을 알지 못합니다.

데이터베이스의 데이터 무결성을 보장하기 위해 Rails의 다형성 연결을 사용하고 싶지 않습니다. 나는 Rails 모델을 커스터마이징 할 필요가 있지만, 그 주제에 도달하지는 않는다. 주된 문제는 PK를 FK로 만드는 마이그레이션을 작성하는 방법입니다 (또는 그 반대).

답변

1

를 ("당신은 전달하여 기본 열 ID를 만들 수 없습니다 레일을 이야기해야합니다 ID : 옵션에서 "거짓) :

마이그레이션 : 모델에서

def change 
    create_table :VipPerson, id: false do |t| 
    t.primary_key :person_id # Normal integer PK, shouldn't auto-increment 
    t.integer :vip_status 
    ..... etc. 
    end 
end 

:

class VipPerson < ActiveRecord::Base 
    self.primary_key = "person_id" 
    belongs_to :person, foreign_key: "person_id" 
end 

모델의 동일한 열을 수동으로 가리 키기 만하면됩니다. 그런 다음 데이터베이스 레이어에서 기본 키를 실제 외래 키로 강화할 수 있습니다 (Demi Magus 대답 참조).

2

외부 키 관계는 당신이 release notes에서 볼 수 있듯이 4.2입니다 레일의 최신 버전에서만 사용할 수 있습니다, 당신은 간단한 외래 키

add_foreign_key :articles, :authors 
작성이

처럼 사용할 수 있습니다

를 생성 :

ALTER TABLE "articles" ADD CONSTRAINT articles_author_id_fk FOREIGN KEY ("author_id") REFERENCES "authors" ("id") 

는 또한 add_foreign_key 만 만 외래 키 제약, 교류 좋아하지 열을 생성 할 것이라는 점을 알아야한다 그냥 레일의 가장자리를 찾고하지 않는 경우가 더 많은 정보 또한 here

을 찾을 수 있습니다

ALTER TABLE "articles" ADD COLUMN author_id INT(11); 

는, 당신은이 보석 유용 할 수있다 : tiverecord add_column은

add_column :articles, :author_id, :integer 

가 생성됩니다 않습니다 당신이 바라는 것을 할 수있게 해주는 것은 composite_primary_keys입니다.주의해야 할 것은 레일즈 버전과 호환되는 버전을 사용해야한다는 것입니다.

가 나는 그것이 도움이되기를 바랍니다 : D 솔루션은 수동 모델의 기본 키와 외래 키를 설정하기보다는 마이그레이션에 조롱한다

+0

실제로 이것은 매우 도움이됩니다. 감사합니다. 나는 또한 그것을 사용할 것이다! 그러나 어쩌면 나는 조금 모럴 특유해야만했다. 칼럼을 외래 키로, 레일스 관점에서 기본 키로하고 싶습니다. 즉, t.primary_key 및 t.references와 같은 것을 동일한 열에 매핑하려고합니다. 원래 질문에 의사 코드를 추가했습니다. – ZeroMax

+0

문서에서 찾지 못했다면 찾고있는 것을 할 수있는 방법이 없을 것입니다. 또한 레일스의 마지막 버전은 한 달 전에 출시되었으므로 그것에 대해 전문가를 찾는 것이 매우 새롭고 어려웠습니다. 내 대답이 유용하다면 나는 업보트에 감사 할 것이다 : D. 행운을 빌어 요, D –

+0

죄송합니다. 제 제제가 당신을 잘못 인도했을 수도 있습니다. 내 질문은 실제로 최신 버전의 Rails에 국한되지 않습니다. 이 문제는 실제로 ActiveRecord가 시작된 이후부터 적용됩니다. 이와 같은 데이터베이스 구조는 일반적인 경우이며 Rails가 등장하기 전에 주위를 둘러 보았습니다. 실제로 이와 같은 시나리오가 일반적이기 때문에 실제로는 아무런 해결책이 없다고 저는 생각하지 않습니다. 오후 8시 30 분 P.S. 제 의원은 아직 투표 하기엔 너무 낮습니다. Q___Q – ZeroMax

관련 문제