0

식당, 메뉴, 섹션 및 요리와 같은 4 가지 상호 연관된 모델이 있습니다. 접시 have_and_belong_to_many 섹션과 궁극적으로 협회 체인의 맨 아래에 있습니다. 내 응용 프로그램에서 나는 종종 접시의 식당을 여러 번 참조해야합니다.여러 HMT 연관성 대 최상위 수준의 연관성

저는 이것을 달성하기 위해 HMT 연관의 계단식을 만들어야한다고 알고 있습니다. 제 질문은 여러 가지 쿼리를 피하거나 그대로두기 위해 식당과 접시 사이에 belongs_to 관계를 설정하는 것이 이상적입니까? 현재로서는 이것은 단지 더러워졌습니다 (단지 나일지도 모름).

class Restaurant < ApplicationRecord 
    has_many :menus, dependent: :destroy 
    has_many :dishes, through: :menus 
end 

class Menu < ApplicationRecord 
    has_many :sections, dependent: :destroy 
    has_many :dishes, through: :sections 

    belongs_to :restaurant 
end 

class Section < ApplicationRecord 
    belongs_to :menu 

    has_and_belongs_to_many :dishes 
end 

class Dish < ApplicationRecord 
    has_and_belongs_to_many :sections 
end 

답변

0

denormalization 여기에 제안하면 합리적인 것처럼 보일 것입니다. 언제나 그렇듯이, 비정규 화의 성능 향상은 도입 된 복잡성, 특히 요리가 속한 레스토랑이 항상 해당 섹션의 메뉴가 속한 레스토랑과 동일한 지 확인하는 코드를 작성할 필요성에 비중을 두어야합니다.

내 접근 방식은 다음과 같습니다. 실제 성능 문제가 해결 될 때까지 정규화 된 데이터 모델을 유지하십시오. 그런 다음이를 해결하기 위해 비정규 화를 고려할 수 있습니다.

여전히 HMT가 계단식이지만 직접 위자료를 사용하는 것처럼 위임자를 작성하여 코드를 깨끗하게 작성하는 것이 좋습니다. 나는 생각 해요 :

class Dish < ApplicationRecord 
    delegate :restaurant, to: :section 
end 

class Section < ApplicationRecord 
    delegate :restaurant, to: :menu 
end 

그런 다음 당신이 할 수 있습니다

dish.restaurant 
+1

당신이있는 거 점을 코드를 작성하는 그 섹션의 메뉴가 날이 속한 레스토랑 접시는 같은 레스토랑에 속한다는 것을 확인하기 위해 HABTM 협회에 지금 질문하기 시작했습니다. –

+0

나는 HABTM 섹션을 요리하는 것을 눈치 채지 못했습니다. 그것은 내가 묘사 한 대표단이 접시마다 고유 한 부분을 가정하기 때문에 실패 할 것입니다. – hoffm

+0

이 경우 비정규 화가 붙어 있습니까? –