레일

3

(어떤 나쁜 영어 죄송합니다)레일

에서 다형성 협회를 피하는 것은의는 A, B, C를 각각의 모델은 하나 개의 주소를 가지고 내가 모델이 있다고 가정하자.

"SQL 반 패턴 : 데이터베이스 프로그래밍의 함정 피하기"(제 7 장 - 다형성 연관) "공통 수퍼 테이블"(또는 기본 테이블이라고도 함)을 사용하여 이러한 연결을 피할 수있는 방법이 있습니다. 조상 테이블).

다형, 그것은 다음과 같습니다

table addresses: 
    id: integer 
    parent_type:string # 'A', 'B' or 'C' 
    parent_id: integer 

을 당신이 교차 테이블을 사용할 수 있습니다 알고 있지만, 다음과 같은 솔루션은보다 세련된 외모 : 주소와 A, B, C를 연결 다형

대신을의 조리법은 ID 필드 (대리 키 또는 의사 키) 만있는 슈퍼 테이블 (주소 지정)을 만드는 것이 좋습니다. 그런 다음 다른 테이블은 주소 지정을 참조합니다. 그런 식으로 작성자는 "외래 키에 의한 데이터베이스의 데이터 무결성 강화에 의존 할 수 있습니다"라고 말합니다. 그래서, 그것은 다음과 같습니다

table addressing 
    id: integer 
table addresses 
    id: integer 
    addressing_id: integer (foreign_key) 
    zip: string 
table a 
    id: integer 
    addressing_id: integer (foreign_key) 
    name: string 
table b 
    id: integer 
    addressing_id: integer (foreign_key) 
    name: string 
table c 
    id: integer 
    addressing_id: integer (foreign_key) 
    name: string 

SQL 쿼리는 다음과 같습니다

SELECT * from a 
    JOIN address USING addressing_id 
    WHERE a.addressing_id = 1243 

질문입니다 : 어떻게 레일 이러한 시나리오를 코드? 나는 여러 가지 방법으로 성공하지 못했습니다.

+0

당신은 협회 [1]에 대한 RoR 가이드를 볼 수 있습니다. 아마도 : through 옵션으로 이것을 할 수있는 방법을 찾을 수 있습니다. 죄송하지만이 순간에는 시도 할 수 없습니다. [1] : http://guides.rubyonrails.org/association_basics.html#the-has_one-through-association –

답변

1

개체 A, B 및 C는 각각 하나의 주소를 갖고 있습니까? 또는 여러 주소가 필요합니까? 아래에 귀하의 의견을 보면 각 개체가 하나의 주소를 가지고있는 것처럼 보입니다.

모든 개체에 주소가 하나만 있으면 주소 ID가있는 A/B/C 개체에 외래 키를 간단히 넣을 수 있습니다.

class House < ActiveRecord::Base 
    belongs_to :address 
end 

class Office < ActiveRecord::Base 
    belongs_to :address 
end 

귀하의 office들과 houses DB 테이블 need to have a foreign key address_id : 집 또는 사무실 객체가 하나 개의 주소를 보자. 이렇게하면 house.address 또는 office.address과 같은 것으로 개체의 주소에 액세스 할 수 있습니다.

이러한 개체의 주소가 많은 경우 솔루션은 A/B/C 개체에 따라 다릅니다. 관련이 있다면 단일 테이블 상속 (Rails supports this pattern well)을 사용할 수 있습니다. 그러나 더 많은 정보가 없으면 어느 것이 최선의 접근 방식인지 말할 수 없습니다.

+0

2nd. "각 모델마다 하나의 주소가 있습니다. 테스트 할 수 있도록 코드를 게시 할 수 있습니까? has_one 연관을 반영하는 테이블 '주소'에서 A/B/C에 대한 foreign_keys가 필요한 것처럼 보입니다. 주소가 A 또는 B 또는 C와 독점적으로 연관되어 있기 때문에 nil 값 –

+0

"각 모델에는 하나의 주소가 있습니다"따라서 A/B/C 모델에 해당 주소에 대한 참조를 넣으면 이후 값이 0이 아닙니다. 각각의 객체는 주소를 가지고 있거나 가지고 있지 않다. 내 대답을 업데이트하여 더 잘 설명 할 수 있도록하자 . –

+0

좋아 보인다! 참조 무결성은 무엇인가? 틀림없이 belongs_to : address, : dependent => : 집을 파괴하는 경우 파괴하라. 그러나 주소를 파괴하는 것은 어떨까요? –