Для всех ваших ассоциаций 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])
И посмотрите результат. Обратите внимание, как создается новая операция вместе с сопутствующими удобствами активности в одной транзакции?