(Рельсы) Как я могу создать двойную вложенную форму, в которой записи еще не могли существовать ни на одном из уровней вложенности?

#ruby-on-rails #forms #simple-form #nested-forms

Вопрос:

Объяснять:

  • У меня есть Artist модель, у которой может быть несколько настроек, например, одна или несколько «Соло», «Дуэт», «Трио» или «Группа».
  • Существует Artist модель, ArtistSetup модель и ArtistSetupSelection модель, которая соединяет эти два
  • Текущая форма представляет собой список флажков, в которых перечислены все настройки, которые создают или удаляют соединение ArtistSetupSelection в зависимости от того, установлено оно или нет, и выглядит следующим образом:
 lt;%= simple_form_for @artist do |form| %gt;  lt;%= form.input :artist_setup_ids, label: false, :as =gt; :check_boxes do %gt;  lt;%= form.collection_check_boxes :artist_setup_ids, ArtistSetup.select_list, :id, :name do |b| %gt;  lt;%= b.label %gt;amp;nbsp;amp;nbsp;lt;%= b.check_box %gt;  lt;% end %gt;  lt;% end %gt; lt;% end %gt;  
  • Как это работает в настоящее время, artist_setup_selections они сохраняются с помощью формы исполнителя, отправляя artist_setup_ids параметры, а не фактически через вложенную форму

Передо мной была поставлена задача добавить в дополнение к этому систему, в которой для каждой настройки (Соло, Дуэт, Трио, группа) исполнитель может выбрать, как далеко он готов отправиться, и минимальную плату, которую он хотел бы получить за это расстояние. Существуют заданные расстояния в 25, 50, 100 и 100 (миль), поэтому, по сути, форма должна выглядеть следующим образом (просто макет, игнорируйте дизайн/четкость): (https://i.imgur.com/n3Lts5E.png)

что я сделал:

  • Я добавил новую модель distances , в которой сохранены записи о расстоянии 25, 50, 100 и более 100
  • Я добавил модель под названием artist_distance_selections которая принадлежит distance и artist_setup_selections и имеет fee столбец

Я прикрепил небольшую визуальную схему, чтобы сделать ее более понятной. (https://i.imgur.com/h1iqJyq.png)

По сути, я пытаюсь спросить, как создать двойную вложенную форму с флажками, которые могут создавать или удалять запись, если она отмечена/снята на обоих уровнях вложенности, а также отправлять плату на втором уровне. Одна из проблем заключается в том, что должны существовать флажки для полей, которые еще не существуют.

Это моя попытка:

исполнители/редактировать.html.erb

 ... lt;%= simple_form_for @artist do |form| %gt;  lt;%= form.input :artist_setup_ids, label: false, :as =gt; :check_boxes do %gt;  lt;%= form.collection_check_boxes :artist_setup_ids, ArtistSetup.all, :id, :name do |b| %gt;  lt;%= b.label %gt;amp;nbsp;amp;nbsp;lt;%= b.check_box %gt;  lt;% end %gt;  lt;% end %gt; lt;% end %gt;  lt;%= simple_form_for @artist do |form| %gt;  lt;%= form.simple_fields_for :artist_setup_selections, ArtistSetupSelection.collection(current_user.account) do |f| %gt;  lt;fieldsetgt;  lt;%= f.simple_fields_for :artist_distance_selections, ArtistDistanceSelection.collection(f.object) do |fb| %gt;  lt;%= fb.check_box :checked %gt;  lt;%= fb.number_field :fee %gt;  lt;% end %gt;  lt;/fieldsetgt;  lt;% end %gt; lt;% end %gt; ...  

artist_setup_selection.erb

 def self.collection(artist)  setup_selections = artist.artist_setup_selections  ArtistSetup.where('id NOT IN (?)', setup_selections.map(amp;:artist_setup).pluck(:id)).each do |setup|  setup_selections lt;lt; ArtistSetupSelection.new(artist: artist, artist_setup: setup)  end  setup_selections.sort_by { |setup_selection| setup_selection.artist_setup.id } end  

artist_distance_selection.erb

 def self.collection(setup_selection)  distance_selections = setup_selection.artist_distance_selections  Distance.where('id NOT IN (?)', distance_selections.map(amp;:distance).pluck(:id)).each do |distance|  distance_selections lt;lt; ArtistDistanceSelection.new(distance: distance, artist_setup_selection: setup_selection)  end  distance_selections.sort_by { |distance_selection| distance_selection.distance.id } end