Создание вложенной модели в рельсах - PullRequest
0 голосов
/ 19 марта 2012

Я играю с консолью 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"]}>

Оба объекта являются новыми, поэтому нормально, что у объекта вопроса нет идентификатора.

Я знаю, что мог бы создать объект ответа, сначала создав вопрос, а затем вызвав для него update_attributes ... Или просто создав вопрос, а затем вызвав answer.build на нем ...

У меня вопрос ... Есть ли способ для дочерней модели получить идентификатор своего родителя при создании?

Да, и если вам интересно, у меня действительно есть проверка, для которой требуется, чтобы ответ имел значение question_id.

ТНХ!

Ответы [ 3 ]

0 голосов
/ 19 марта 2012

Я думаю, вам нужно использовать accepts_nested_attributes_for, чтобы разрешить массовое назначение для вложенных моделей.Обратитесь к справочнику API для получения дополнительной информации по теме

0 голосов
/ 12 октября 2012

Я наконец-то нашел ответ на свой вопрос ...

Мне нужно было поставить этот код:

: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
0 голосов
/ 19 марта 2012

при использовании create учитывает массовое назначение, поэтому убедитесь, что вы добавили attr_accessible :answer_attributes к своему Question классу или используете

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