【问题标题】:Nested model creation in rails在 Rails 中创建嵌套模型
【发布时间】:2026-02-13 14:05:01
【问题描述】:

我正在使用 Rails 控制台,想知道为什么以下代码不起作用:

Question.create(body: "Why this does not work?", answer_attributes: {body: "Some Answer"})

我这样做很奇怪:

question = Question.new(body: "Why this does not work?", answer_attributes: {body: "Some Answer"})
question.answer

我得到的东西看起来像这样:

=> #<Answer id: nil, body: "Some Answer", question_id: nil, created_at: nil, updated_at: nil>

似乎答案对象与问题对象相关...

现在如果我尝试保存对象,它不起作用:

question.save

我明白了:

 => false

当我调用 .errors 时,我得到了这个:

question.errors
@messages={:"answer.question_id"=>["can't be blank"]}>

两个对象都是新的,所以问题对象没有 id 是很正常的。

我知道我可以通过首先创建一个问题然后调用 update_attributes 来创建答案对象...或者简单地通过创建一个问题然后调用 answers.build 来创建它...

我的问题是...有没有办法让子模型在创建时获取其父 ID?

哦,如果您想知道,我确实有一个验证,需要一个答案才能具有 question_id 值。

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby activerecord ruby-on-rails-3.1 model


    【解决方案1】:

    使用 create 尊重质量分配,因此请确保将 attr_accessible :answer_attributes 添加到您的 Question 类中,或使用

    Question.create({body: "Why this does not work?", answer_attributes: {body: "Some Answer"}},)
    

    【讨论】:

    • 你能发布你的问答课程吗?
    【解决方案2】:

    我认为您需要使用accepts_nested_attributes_for,以便允许对嵌套模型进行质量分配。有关该主题的更多信息,请参阅 api 参考

    【讨论】:

      【解决方案3】:

      我终于找到了我的问题的答案......

      我需要输入这段代码:

      :inverse_of => :question
      

      所以我的问题模型如下所示:

      class Question < ActiveRecord::Base
        has_many :answers, :dependent => :destroy, :inverse_of :question
      
        accepts_nested_attributes_for :answers
      end
      

      我的答案模型如下所示:

      class Answer < ActiveRecord::Base
        belongs_to :question
      
        validates :question, :presence => true
      end
      

      【讨论】: