2011-09-26 84 views
1

我有一个评价与此类似:填充外键上创建行动

Evaluation.rb

has_one :cardio 
has_one :neuro 

Cardio.rb

belongs_to :evaluation 

Neuro.rb

belongs_to :evaluation 

我的评价控制器与此类似:

def create 
    @patient = Patient.find(params[:id]) 
    @evaluator = Evaluator.find(session[:evaluator_id]) if session[:evaluator_id] 
    @evaluation = Evaliation.new(:patient_id => @patient.id, :evaluator_id => @evaluator.id) 
    @neuro = Neuro.new(:evaluation_id => @evaluation.id) 
    @cardio = Cardio.new(:evaluation_id => @evaluation.id) 
    if (@evaluation.save! && @neuro.save! && @cardio.save!) 

     redirect_to evaluation_path(@evaluation.id), :notice => "Evaluation created" 

    else 
     render ("new") 
    end 
    end 

当评估创建心肺功能和神经创建过,但使用空evaluation_id。 我试图移动if内的@cardio = Cardio.new(:evaluation_id => @evaluation.id),但它没有奏效。

回答

2

@evaluation直到你保存它才会有一个id集,所以当您创建@neuro@cardio时,@ evaluation.id将为零。换句话说:

@evaluation = ... 

if (@evaluation.save!) 
    @neuro = Neuro.new(:evaluation_id => @evaluation.id) 
    @cardio = Cardio.new(:evaluation_id => @evaluation.id) 

    if (@neuro.save! && @cardio.save!) 
    redirect_to evaluation_path(@evaluation.id), :notice => "Evaluation created" 
    else 
    render ("new") 
    end 

else 
    render ("new") 
end 
+0

感谢人,它的工作。但让我们说,我有7或8个更多的评估类型(心,神经,现场测试等)有一个更“美丽”的方式来做到这一点,否则我将不得不手动设置像我在'@ cardio' '@ neuro'? –

+0

我不记得这是否适用于rails 2.x,但在rails3中,您可以执行@evaluation = Evaluation.new(...,:neuro => Neuro.new,cardio => Cardio.new),并且所有对象都将以类似事务的方式保存。 –

+0

不知道它是否适合我,我相信我的关系是错误的(应该有评估的forein键)。非常感谢Adam,我会尽力解决这个问题。 –