0

Ich habe vier miteinander verbundene Modelle: Restaurants, Menüs, Abschnitte und Gerichte. Die Gerichte have_and_belong_to_many Abschnitte und letztlich sind ganz unten in der Assoziationskette. In meiner App muss ich oft mehrmals auf das Restaurant des Gerichts verweisen.Mehrere HMT-Assoziationen gegenüber einer Top-Level-Assoziation

Ich weiß, um dies zu erreichen, würde ich eine Kaskade von HMT-Assoziationen erstellen müssen. Meine Frage ist, ist es ideal, eine belongs_to Beziehung zwischen einem Restaurant und einem Gericht einzurichten, um die mehreren Abfragen zu vermeiden oder zu verlassen, wie es ist? Ab jetzt fühlt sich das nur dreckig an (vielleicht bin ich es nur).

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 

Antwort

0

Die denormalization Sie schlagen scheint hier vernünftig zu mir gegeben Ihren Anwendungsfall. Wie immer müssen die Leistungsgewinne der Entnormalisierung gegen die Komplexität abgewogen werden, die sie einführt, insbesondere die Notwendigkeit, Code zu schreiben, um sicherzustellen, dass das Restaurant, zu dem ein Gericht gehört, immer das gleiche Restaurant ist, zu dem auch das Menü seiner Sektion gehört.

Ich denke, mein Ansatz wäre: Behalten Sie das normalisierte Datenmodell bei, bis Sie ein tatsächliches Leistungsproblem haben, das adressiert werden muss. Dann können Sie Denormalisierung in Betracht ziehen, um es anzugehen.

Während Sie immer noch die Kaskade von HMTs haben, sollten Sie Delegierer schreiben, um den Code so sauber zu machen, als ob Sie eine direkte Restaurant-Gericht-Assoziation hätten. Ich denke:

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

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

Dann können Sie tun:

dish.restaurant 
+1

Sie sind Punktcode auf das Schreiben, um sicherzustellen, dass ein das Restaurant ein Gericht in das gleiche Restaurant Menü seiner Bereich von gehört gehört hat mir meine HABTM-Verbände jetzt in Frage zu stellen. –

+0

Ich hatte nicht bemerkt, dass Geschirr HABTM-Abschnitte. Das wird die Delegation, die ich beschrieben habe, zum Scheitern bringen, da sie eine eindeutige Sektion pro Gericht annimmt. – hoffm

+0

In diesem Fall bin ich mit Denormalisierung fest? –