Создайте несколько подмоделей в форму основной модели - PullRequest
0 голосов
/ 24 октября 2019

Вот ситуация:

class Activity < ApplicationRecord
  has_many :activity_amenities
end
class Amenity < ApplicationRecord
  has_many :activity_amenities
  has_many :activities, through: :activity_amenities
end
class ActivityAmenity < ApplicationRecord
  belongs_to :activity
  belongs_to :amenity
end

Так что в основном у меня есть Activities, у которых Amenities. Причина, по которой я использую ассоциацию has_many :through, заключается в том, что я хочу создать базовые Amenities, и для каждого удобства в «Деятельности» будет дано описание, соответствующее «Деятельности».

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

enter image description here

Поэтому, когда я нажимаю кнопку Add amenity, она должна добавить новую группу выбора / ввода.

Затем, когда я нажимаю создать , он должен создать все ActivityAmenities и связать их с моделью Activity.

Любая идея Как это сделать (вКонтроллер и в виде)? На самом деле ничего не могу найти ...

ps: обратите внимание, что я использую gem простой формы для форм

1 Ответ

0 голосов
/ 25 октября 2019

Для всех ваших ассоциаций has_many включите опцию inverse_of. Затем при добавлении ActivityAferences по ID передайте их все сразу как массив. например, когда вы делаете action_params, передайте activity_amenity_ids []. Rails будет использовать автоматически сгенерированный метод # activity_amenity_ids =, чтобы обработать создание для вас.

Модель:

class Activity < ApplicationRecord
  has_many :activity_amenities, inverse_of: activity
end
class Amenity < ApplicationRecord
  has_many :activity_amenities, inverse_of: amenity
  has_many :activities, through: :activity_amenities
end
class ActivityAmenity < ApplicationRecord
  belongs_to :activity
  belongs_to :amenity
end

Контроллер:

params.require(:activity).permit(activity_amenity_ids[], :whatever_else)

Вид: Независимо от названия вашего ввода для вашей формы

name="activity[activity_amenity_ids][]"

Если выВам нужно объяснение того, почему вы передаете значение activity_amenity_ids, в основном tl; dr создает объект, если он не существует, и ничего не делает, если это так.

Например, попробуйте

Activity.create(name: "Running or whatever", activity_amenity_ids: [1, 2, 3])

И посмотрите результат. Обратите внимание, как создается новая операция вместе с сопутствующими удобствами активности в одной транзакции?

...