Dans une relation de modèle plusieurs à plusieurs, je veux enregistrer plusieurs valeurs sélectionnées dans la table intermédiaire avec la case à cocher. J'étais vraiment intéressé quand je l'ai mis en œuvre, alors je vais le laisser comme un mémorandum.
Rails 5.2
Ruby 2.5.1
MacOSX
class Project < ApplicationRecord
has_many :project_phases, dependent: :destroy
has_many :mst_phases, through: :project_phases
end
class ProjectPhase < ApplicationRecord
belongs_to :project
belongs_to :mst_phase
end
--Maître de processus
class MstPhase < ApplicationRecord
has_many :project_phases
end
Concernant le processus, seul le modèle project_phase
est associé dans la table maître pour que le côté modèle du projet ne soit pas référencé.
View
<%= form_with model: @project, local: true do |f| %>
<label>Nom du projet</label>
<%= f.text_field :project_name %>
<label>Processus de projet</label>
<%= f.collection_check_boxes :mst_phase_ids, MstPhase.all, :id, :phase %>
<% end %>
Controller
class ProjectsController < ApplicationController
def new
@project = Project.new
@project.project_phases.build
end
def create
@project = Project.new(projects_params)
if @project.save
redirect_to project_path @project
else
render action: 'new'
end
end
private
def projects_params
params.require(:project).permit( :project_name, mst_phase_ids: [])
end
end
Le but est de définir StrongParameter
pour recevoir les modèles liés à has_many
en tant que tableau.
Les noms des paramètres doivent être décrits comme suit.
Nom du modèle_ids
Puisqu'il n'est pas nécessaire d'implémenter une logique spéciale pour les paramètres reçus dans le tableau, les enregistrements sont enregistrés dans la table pour le nombre d'éléments du tableau. Rails pratiques. .. .. .. ..