@Axel_F

Как обработать такую форму?

Есть модель `Тренировка` и модель `Упражнение`. Между ними соответствующая связь один-ко-многим. Также есть модель `Группа`, она нужна для того, чтобы выделять необходимые упражнения в группу, которой может присваиваться имя. То есть `Упражнение` одновременно принадлежит двум другим моделям по связи один-ко-многим к каждой.

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

Сделать саму форму получилось, однако не выходит нормально ее обработать в контроллере. Проблема в том, что при создании нового упражнения ему необходимо выдавать id уже созданной группы. Но если запись новой тренировки делается сразу, и уже к ней крепятся новые упражнения, то чтобы присвоить группу, нужно сначала ее создать, получить id созданной записи и уж потом можно создать само упражнение.
Без модели группы можно было бы обойтись штатными средствами(и уложиться в пару строк), так как все записи создаются последовательно, а так приходится весь процесс прописывать вручную. И если для метода create код получился еще более менее понятным, то при редактировании(update) получается совсем каша.

Вопрос в следующем. Есть ли для данной ситуации более изящное решение, чем прописывать все вручную или нет? Или может быть есть вариант немного изменить архитектуру, чтобы избежать таких костылей.
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
ZloyHobbit
@ZloyHobbit
Какое-то запутанное объяснение получается. Лучше приведите пример кода.
Из того, что я понял, вы хотите при создании обыъекта одной модели создавать объект другой, который с первой никак напрмяую не связан. Это архитекрутно не слишком удобно и не слишком тривиально. Лучше бы попробовать как-то преобразовать архитекрутуру.
Что бы использовать один и тот же метод при создании и обнволении можно делать так:
group = Group.find_or_initialize_by(params)
Что бы создавать объект модели сразу со связанными моделями, полезно использовать nested attributes.
В вашем случае это будет что-то вроде:
class Trainig < ActiveRecord::Base
  has_many :exercises
  accepts_nested_attributes_for :exercises
end
...
training = Training.create(training_params.merge(exercises_atrributes: array_with_hashes_of_exercises_atrributes))

Причем в массив параметров для упражнений можно внести данные для создания групп и создавать группу при ее отсутсвии перед созданием упраженения при помощи find_or_initialize_by.

PS. Как правильно сказали в комментариях, для того что бы предевать nested attributes из общей формы удобно использовать fields_for.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы