2014-07-14 5 views
1

사이의 다중 관계 내가 레일 4.0.4에서 데이터베이스 마이그레이션을 만드는거야, 나는 다음과 같은 관계를 캡처 할 :레일 : 두 가지 모델

고객이 많은 신용 카드를 보유하고있다. 고객은 기본 신용 카드가 하나뿐입니다.

여기 보이는 것처럼 보입니다.

class Customer < ActiveRecord::Base 
    has_many :cards 
    has_one :card # i.e. has one default card 
end 

class Card < ActiveRecord::Base 
    belongs_to :customer 
end 

이 정보가 맞습니까? 그렇다면, 레일즈는 Card 클래스의 belongs_to과 어떤 관계가 있는지 어떻게 알 수 있습니까? 그것이 틀렸다면 (그리고 나는 그것이라고 추측하고있다), 제발 도와주세요.

+1

당신의 경우에는'has_many : cards'를 사용하고'boolean column'을'cards' 테이블에서'is_default'와 같이 만들 것입니다. 기본값 카드는'is_default' 열이'true' 일 것입니다. – Pavan

+1

또는 다음과 같이 할 수 있습니다 :'has_one : default_card, : class_name => "Card"' – Pavan

+1

@Pavan과 같은 대답을 제안 할 것이고 간단히 기본 카드의 범위를 정의 할 수 있습니다. 단 하나의 관계 만 필요합니다. –

답변

2

, 날

,691 쉽게 보인다
class Customer < ActiveRecord::Base 
    has_many :card 
end 

class Card < ActiveRecord::Base 
    belongs_to :customer 
    scope :default, -> { where is_default: true } 
end 

default_card = customer.cards.default 
+1

내 생각에이 프로세스는 동일한 모델과의 다중 연관을 갖는 것보다 나은 선택입니다. 더 강력하고 유지하기가 쉽습니다. –

+0

@PamioSolanky 동의합니다. 깨끗한! – FloatingRock

+0

단 하나의 기본 카드/고객을 유지하기위한 추가 구현 로직이 필요한'Cards' 테이블에'is_default' 필드를 추가하는 것이 단점입니다 – FloatingRock

2

현재 귀하의 코드는 has_one :cardhas_many :cards을 가지고 있기 때문에 레일즈를 혼란스럽게 할만큼 충분합니다.이 유형의 연결에는 특별히 class_name 옵션을 사용해야합니다. 당신이

class Customer < ActiveRecord::Base 
    has_many :cards 
    has_one :default_card, :class_name => "Card" 
end 
+0

감사합니다. 'Card' 모델에도 아무것도 추가해야합니까? – FloatingRock

+0

@ Yazin 아니요,이 정도면 충분합니다. – Pavan

2

Pavan's 대답에 추가 foreign_key, 당신은 default 카드인지를 결정하는 조건의 어떤 종류를 사용해야합니다이 같은

뭔가 작동합니다.

레일 'relational database 구조가 관련 데이터를 끌어 foreign_keys에 의존하기 때문에, 당신도 당신의 default_card에 대한 올바른 foreign_key을 할당하거나 그것을 찾기 위해 조건을 사용해야합니다 :

#app/models/customer.rb 
Class Customer < ActiveRecord::Base 
    has_one :default_card, -> { where default: true" },class: "Card", foreign_key: "customer_id" 
end 

이 의존하는 것 당신의 cards 테이블에서 부울 열 default있는에

내가 카드의 측면에있는 범위를 넣어 것
관련 문제