0

У меня есть эти модели, и я использую кокон с nested_attributes:Откат при создании объекта с вложенными атрибутами

моделей/report.rb:

class Report < ApplicationRecord 
    has_many :option_students 

    accepts_nested_attributes_for :option_students, allow_destroy: true 
end 

модели/option_students.rb:

class OptionStudent < ApplicationRecord 
    belongs_to :student 
    belongs_to :option 
    belongs_to :report 
end 

Я пытаюсь создать отчет с помощью консоли rails. У меня уже есть ученик и опция, сохраненная в БД.

Если я пишу:

Report.create(option_students_attributes: [{student_id: 1, option_id: 1}]) 

консоль выводит Откат:

(0.2ms) BEGIN 
    Student Load (0.2ms) SELECT "students".* FROM "students" WHERE "students"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Option Load (0.1ms) SELECT "options".* FROM "options" WHERE "options"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    (0.2ms) ROLLBACK 

Он не создает отчет, ни объект option_student.

Но если я типа Report.create, а затем я пишу

Report.update(1, option_students_attributes: [{student_id: 1, option_id: 1}]) 

Он успешно создает студента вариант при обновлении отчета. Что я делаю с этим неправильно? Я просто использовал вложенные атрибуты с другими моделями, и это сработало.

ответ

3

Я предполагаю, что вы используете рельсы 5, которые изменили отношение belongs_to по умолчанию. Что теоретически при сохранении вложенных атрибутов не должно быть проблемой, а потому, что идентификатор отчета еще не установлен при сохранении (на самом деле: при проверке), сбой не будет выполнен. Это может просто быть вылечена, говоря рельсам, как ассоциации, связанные:

has_many :option_students, inverse_of: :report 

В качестве альтернативы можно добавить optional опцию в OptionsStudent классе:

belongs_to :report, optional: true 

, которая не является правильным, он просто будет пропускать проверку , но, возможно, это может быть актуально для двух других отношений: если ни ученик, ни вариант не всегда требуются.

+0

Спасибо! Просто добавив опцию: true, решила проблему! –