2017-09-07 1 views
0

Je dois modéliser l'utilisateur et GeoScene avec une relation plusieurs-à-plusieurs via has_and_belongs_to_many :users/:geo_scenes. Dans un formulaire utilisateur, on peut assigner des droits pour accéder à geo_scenes à l'utilisateur. Tous les geo_scenes sont répertoriés avec une case à cocher - pour chaque case geo_scene un enregistrement dans la table de jointure geo_scenes_users est créé après l'envoi du formulaire:Ajouter un attribut supplémentaire à la table de jointure plusieurs-à-plusieurs

--- First User --- 

Geo Scene One [ ] 
Geo Scene Two [x] 
Geo Scene Three [ ] 

forme actuelle:

= form_for(@user) do |form| 
... 
    = hidden_field_tag("user[geo_scene_ids][]", nil) 
    - GeoScene.all.each do |s| 
     .checkbox 
     %label 
      = check_box_tag("user[geo_scene_ids][]", s.id, s.id.in?(@user.geo_scenes.collect(&:id))) 
      = s.name 

Controller prend params forts:

def user_params 
    params.require(:user).permit(:email, :password, :password_confirmation, { geo_scene_ids:[] }) 
    end 

maintenant la question:

Comment ca n je manipule un attribut booléen supplémentaire write dans la table de jointure. Il devrait y avoir une deuxième case à cocher à chaque GeoScene permettant la mise à jour write. Une rangée d'échantillons de geo_scenes_users semble que les éléments suivants:

user_id | geo_scene_id | write 
------------------------------ 
1  | 1   | true 

Je suppose que je dois supprimer les raccourcis has_and_belongs_to_many et de construire un modèle de jointure supplémentaires. Mais comment puis-je gérer les listes de cases à cocher dans le formulaire alors?

--- First User --- 

Geo Scene  read write 
--------------------------- 
Geo Scene One [x] [ ] 
Geo Scene Two [x] [x] 
Geo Scene Three [ ] [ ] 

Répondre

0

Votre formulaire ne va pas changer. Ajoutez simplement le modèle de jointure et les associations. collection_singular_ids=(ids) méthode (geo_scene_ids=(ids) dans votre cas) est disponible à la fois pour has_and_belongs_to_many et has_many associations.

http://guides.rubyonrails.org/association_basics.html#has-many-association-reference

class GeoScenesUser # join model 
    belongs_to :geo_scene 
    belongs_to :user 
end 

class User 
    has_many :geo_scenes_users 
    has_many :geo_scenes, through: :geo_scenes_users 
end 

Après que vous avez méthode User#geo_scene_ids=(ids) disponible, qui fonctionnera lorsque vous passez geo_scene_ids de la forme, comme vous l'avez fait avec has_and_belongs_to_many