Ruby on rails 在创建操作上填充外键

Ruby on rails 在创建操作上填充外键,ruby-on-rails,foreign-keys,Ruby On Rails,Foreign Keys,我的评估与此类似: 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) @

我的评估与此类似:

  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.rb

has_one :cardio
has_one :neuro
belongs_to :evaluation
belongs_to :evaluation
Cardio.rb

has_one :cardio
has_one :neuro
belongs_to :evaluation
belongs_to :evaluation
Neuro.rb

has_one :cardio
has_one :neuro
belongs_to :evaluation
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
创建评估时,也会创建cardio和neuro,但评估id为空。
我试图将
@cardio=cardio.new(:evaluation\u id=>@evaluation.id)
移动到
的if
中,但它也不起作用。

@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

谢谢,伙计,它起作用了。但假设我还有7或8种评估类型(心脏、神经、现场测试等),有没有更“漂亮”的方法,或者我必须像我在
@cardio
@neuro
上所做的那样手动设置foring键?我不记得这在rails 2.x中是否有效,但在rails3中,您可以执行@evaluation=evaluation.new(…,:neuro=>neuro.new,:cardio=>cardio.new),所有对象都将以类似事务的方式保存。不知道它是否适用于我,我相信我的关系是错误的(应该在评估时使用forein键)。非常感谢Adam,我将尝试修复此问题。