2017-08-21 3 views
0

Ich habe ein Modell Orders mit zwei Kindern Items und fulfillments.Schienen Einstellung Einstellung zwei Kindermodelle

Wenn ein fulfillment erstellt wird, muss ich Items.fulfillment_complete auf True setzen.

Ist dies in der Steuerung der beste Weg, dies zu tun?

current_order.fulfillment.save current_order.items(fulfillment_complete: true)

Oder gibt es einen besseren Weg, dies zu tun, dass man um sicherzustellen, dass folgende MVC Praktiken.

+0

Modellnamen sind normalerweise singulär. Haben Sie einen Fullfillment für jeden Artikel in der Bestellung (ich nehme an ein "Artikel" ist etwas wie Produkt + Menge + Anpassungen, nicht ein Produkt selbst?) Oder ist es eine Fullfillment für die gesamte Bestellung? Wie auch immer, warum nicht einfach die Präsenz der Beziehung selbst nutzen? –

+0

Sie versuchen grundsätzlich, "Caching" durchzuführen, indem Sie Daten (in diesem Fall 'bool') speichern, um die Existenz/den Zustand anderer Daten zu reflektieren. Für etwas so einfaches, schlage ich vor, dass Sie diese Informationen nicht zwischenspeichern und nur berechnen (Methode 'Item # erfüllt?' Würde das Ergebnis von 'self.fulfillments.exists zurückgeben?') - Das Problem mit dem Caching, ist nicht Um die Daten für das Caching zu erstellen, müssen Sie sicherstellen, dass Sie diesen Cache bei Bedarf löschen. – MrYoshiji

+0

Könnten Sie bitte weitere Einzelheiten zu den Modellen 'Item' und' Fulfillment' angeben? Dann wird es viel einfacher zu verstehen, was Sie wollen und wie Sie die richtige Lösung implementieren. – zauzaj

Antwort

0

Wenn Fulfillment und Item sind beide Kinder von Order dann items kann Order an die Mutter delegieren, wenn zu fragen, ob sie erfüllt worden sind.

class Item < ApplicationRecord 
    belongs_to :order 

    scope :fulfilled, -> { includes(order: :fulfillment).where.not(fulfillments: { order_id: nil }) 

    def fulfilled? 
    order.fullfillment.present? 
    end 
end 

Dies stellt sicher, dass Sie nur eine einzige Quelle der Wahrheit bezüglich des Erfüllungsstatus haben.