0

Ich habe 4 Klassen, mit einem STI on Instance.Rails verschachtelt erstellen STI

Arbeitsbereich, Projekt, Aufgabe, Instanz, (Typ1 < Instanz) und (Typ2 < Instanz).

Mit richtigen Assoziationen. (Arbeitsbereich has_many Projekte, has_many Aufgabe durch Projekte, usw.)

Und ich habe diese verschachtelt erstellen (arbeitete vor STI Umsetzung):

if (%w(type1 type2).include?(params[:type])) 

sti_class = params[:type].classify.constantize 

workspaces.find_by_name(name: w_name). 
projects.where(name: p_name).first_or_create!. 
tasks.where(name: t_name).first_or_create!. 
sti_class.create() 

jetzt, das nicht funktioniert, kann ich nicht verstehen einen Weg.

Allerdings funktioniert das folgende, aber ich möchte die verschachtelten erstellen.

task= workspaces.find_by_name(name: w_name). 
     projects.where(name: p_name).first_or_create!. 
     tasks.where(name: t_name).first_or_create! 

sti_class.create(task_id: task.id) 

Wie kann ich die verschachtelten erstellen?

Antwort

1

Das Problem, das ich sofort ableiten konnte ist, dass die sti_class Methode in Ihrem Task Modell nicht definiert ist, wie Sie es der Methodenkette hinzufügen.

Sie nicht wirklich denken, dass Sie nach der besten Praxis hier, aber das Problem sofort zu beheben, sollten Sie wahrscheinlich so etwas wie:

if (%w(type1 type2).include?(params[:type])) 
# depending on the association between the type(s) and the tasks, 
# you'd need to either singularize or pluralize here, I'd assume 
# task has many types, therefore pluralize 

sti_class = params[:type].pluralize 

# if you're already calling `find_by_name`, you don't need to pass 
# the name option here anymore, but the name argument 

workspaces.find_by_name(w_name). 
projects.where(name: p_name).first_or_create!. 
tasks.where(name: t_name).first_or_create!. 
send(sti_class).create 
+0

Dank, ich werde jetzt dabei bleiben :) – Gaston

+0

cool. Akzeptiere die Antwort, wenn es dein Problem löst! – oreoluwa