Rails嵌套创建STI

时间:2016-07-10 16:48:15

标签: ruby-on-rails model-associations single-table-inheritance sti

我有4个clases,在实例上有一个STI。

工作区,项目,任务,实例,(type1< Instance)和(type2< Instance)。

有适当的联想。 (Workspace has_many项目,has_many任务通过项目,等等)

我有这个嵌套的创建(在实施STI之前工作):

get

现在,这不起作用,我无法找到方法。

但是,以下工作,但我想保留嵌套的创建。

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() 

如何保留嵌套的创建?

1 个答案:

答案 0 :(得分:1)

我可以立即推断的问题是,sti_class模式中没有定义Task方法,因为您正在将其添加到方法链中。

不要认为你是在遵循这里的最佳做法,但要立即解决问题,你应该做的事情如下:

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