Ich habe eine Situation, wo ich "parametrische" Modelle in Schienen machen möchte; zum Beispiel würde ich gerne PrototypeRecipe
definieren, und dann in der Lage sein, mehrere DerivedRecipe
's zu machen; vielleicht verwendet ein abgeleitetes Rezept mehr Zucker und ein anderes verwendet weniger Eier oder etwas. Der kritische Punkt ist, dass ich möchte, dass alle 'abgeleiteten' Instanzen Eigenschaften von einem einzigen freigegebenen PrototypeRecipe
erben, aber in der Lage sein müssen, lokale Modifikationen vorzunehmen.Schienen Modell Vorlagen (oder Instanz Vererbung) Optionen?
Idealerweise würde ich gerne Methoden für den Prototyp definieren (zB eine Einkaufsliste zusammenstellen) und diese Methoden auf lokale Änderungen in abgeleiteten Instanzen reagieren lassen (also wenn ich 3 Eier anstelle von 2 angegeben habe , könnte ich die make_shopping_list
Funktion des Prototyps nennen und es würde das reflektieren).
Gibt es eine existierende Methode, um so etwas zu erreichen? Hier ist das Beste, was ich mit so weit kommen können:
class Ingredient << ActiveRecord::Base
belongs_to :recipe, :polymorphic => true
# uuid => UUID String (for grouping ingredients which change between prototype and derived instances)
end
class PrototypeRecipe << ActiveRecord::Base
has_many :ingredients
def make_ingredient_list(derived_recipe = nil)
self.ingredients.map {|i| derived_recipe.nil? ? i : derived_recipe.ingredients.where(:ingredient_uuid => i.uuid).first }
end
end
class DerivedRecipe << ActiveRecord::Base
belongs_to :prototype_recipe
has_many :ingredients
def method_missing(sym, *args)
self.prototype_recipe.send(sym, *args, self)
end
end
Ich weiß, dass dieser Code kann viel sauberer gemacht werden, frage ich mich mehr, wenn der allgemeine Ansatz verbessert werden kann auf. Die Grundidee ist, dass Zutaten jeweils eine eindeutige ID haben. Um ein Prototyprezept zu modifizieren, erstellen Sie einfach eine Instanz von DerivedRecipe
, verknüpfen diese mit dem Prototyp und fügen dann eine Zutat mit derselben UUID wie eine der Zutaten des Prototyps hinzu.
du meinst '<' ... nicht '<<' – Tilo