Disons que j'ai une classe comme:Instancier dynamiquement la sous-classe STI imbriquée Rails?
class Basket < ActiveRecord::Base
has_many :fruits
Où "fruits" est une classe de base STI ayant comme sous-classes "pommes", "oranges", etc ...
Je voudrais être en mesure d'avoir une méthode setter dans le panier comme:
def fruits=(params)
unless params.nil?
params.each_pair do |fruit_type, fruit_data|
fruit_type.build(fruit_data)
end
end
end
Mais, évidemment, je reçois une exception comme:
NoMethodError (undefined method `build' for "apples":String)
Une solution que je pensais fonctionne comme ceci:
def fruits=(params)
unless params.nil?
params.each_pair do |fruit_type, fruit_data|
"#{fruit_type}".create(fruit_data.merge({:basket_id => self.id}))
end
end
end
Mais qui cause l'objet STI fruits à instancier avant la classe de panier, et donc la clé de basket_id est jamais enregistré dans la sous-classe Fruit (parce que basket_id n » t existe encore).
Je suis totalement perplexe. Quelqu'un a des idées?
Cela fonctionne pour mes fins. Mais si je comprends bien, cela signifie que les rappels que je pourrais avoir sur mes sous-classes STI ne fonctionneront pas, correct? –
Malheureusement, oui. Voir ma réponse éditée si. – zetetic
Génial! Merci beaucoup! –