Comment une association has_many :through fonctionne en pratique
On janvier 3, 2022 by adminLorsque vous commencez à travailler avec Rails et ActiveRecord, il peut être difficile d’envelopper votre tête autour du concept des associations has_many :through, et plus important encore, comment elles peuvent être utilisées dans votre application Rails.
« disons que j’ai un groupe, un membre, des adhésions… comment puis-je ensuite réellement UTILISER cela dans mes modèles, contrôleurs et vues ? »
« J’utilise une relation has_many :through qui semble fonctionner. J’ai maintenant besoin d’un formulaire que je peux rendre pour que les utilisateurs rejoignent ou quittent le groupe. »
Pour commencer, vous devriez être raisonnablement sûr qu’une association has_many :through est un bon choix pour la conception de votre application. En supposant que vous le soyez, voici comment vous pouvez la mettre en pratique.
Disons que vous construisez une app avec des utilisateurs et des groupes, et que vous voulez construire un formulaire où un utilisateur donné peut rejoindre ou quitter n’importe quel groupe. Vous avez choisi d’associer vos utilisateurs et vos groupes par le biais de la table Membership.
Vos modèles sont structurés comme suit :
class User < ActiveRecord::Base has_many :memberships has_many :groups, through: :membershipsendclass Group < ActiveRecord::Base has_many :memberships has_many :users, through: :membershipsendclass Membership < ActiveRecord::Base belongs_to :user belongs_to :groupend
Je trouve toujours utile, avant de commencer à écrire mes contrôleurs ou mes vues, de réfléchir à ce que je veux accomplir, et d’utiliser la console Rails pour m’assurer que je suis sur la bonne voie. En d’autres termes, j’essaie d’arriver à un avec un objectif final, puis de travailler à rebours avec l’aide de la console Rails pour trouver ma solution.
Donc, étant donné que nous voulons rendre un formulaire qui permet à un utilisateur de rejoindre ou de quitter un groupe, nous devrions nous demander, « qu’est-ce que cela signifie d’avoir un utilisateur qui rejoint un groupe ? »
En ce qui concerne la base de données, cela signifie essentiellement que la table Membership
aura une ligne avec les colonnes user_id
et group_id
correspondant à notre utilisateur et notre groupe donnés. Notre tâche consiste alors à orchestrer les choses de telle sorte que lorsque l’utilisateur clique sur « soumettre » dans son formulaire, la table Membership
se retrouve avec une nouvelle ligne (ou plusieurs lignes) avec les valeurs correctes user_id
et group_id
.
Dans le formulaire/vue que nous rendons pour l’utilisateur, nous avons besoin d’un moyen par lequel l’utilisateur peut sélectionner les groupes qu’il veut rejoindre. Et dans le contrôleur, nous voulons extraire les choix que l’utilisateur a fait dans le formulaire et utiliser ces choix pour créer de nouvelles lignes dans la table Membership
.
Premièrement, imaginez que vous ayez un user_id
et un group_id
, comment feriez-vous pour créer cette nouvelle ligne dans la table Adhésion ? ActiveRecord vous facilite la tâche. Ce que nous voulons faire, c’est, pour un enregistrement User
donné, ajouter une ‘adhésion’ à celui-ci, de sorte que lorsque nous disons @user.groups
, nous obtenons en retour une liste de groupes qui inclut le groupe que nous venons d’ajouter. Si vous faites ceci:
#assuming @user is your User [email protected] << Group.find(group_id)#if you have a list of group_ids(something like ), you can also do:@user.group_ids << group_ids
Ce morceau de code créera automatiquement une nouvelle ligne dans la table Membership avec les bons group_id
et user_id
. Et maintenant, chaque fois que vous utilisez @user.groups
, vous obtiendrez en retour une liste des groupes que vous avez ajoutés. Pour plus de confiance, essayez ce qui précède dans votre console Rails.
Voyez le guide Rails ci-dessous pour plus de détails sur les méthodes qu’ActiveRecord vous fournit lorsque vous utilisez has_many :through
.
Je vais supposer que vous avez un certain type d’authentification mis en place dans votre application, ce qui vous donne accès à la méthode current_user
. Nous aurons besoin de cette méthode pour obtenir notre user_id
, via un simple appel current_user.id
. Une fois que vous avez votre utilisateur (avec quelque chose comme @user = User.find(current_user.id)
), vous pouvez utiliser le code ci-dessus pour ajouter des groupes.
La question suivante est, comment écrire votre vue de sorte qu’elle transmette les valeurs group_id
au contrôleur ?
La façon dont vous écrivez votre vue dépendra entièrement du flux que vous attendez de vos utilisateurs et d’autres facteurs dans votre application. Disons que vous décidez de fournir à votre utilisateur une liste de cases à cocher énumérant les groupes qu’il peut rejoindre ou quitter. Voici une façon simple d’accomplir cela :
<% Group.all.each do |group| %> <%= check_box_tag "user", group.id, @user.group_ids.include?(group.id) %> <%= group.name %> <br /><% end %>
L’utilisation de check_box_tag
nécessite probablement quelques explications.
Le premier paramètre "user"
indique à Rails de regrouper toutes les cases à cocher avec cet ID et de le passer au contrôleur comme un Array. Ce que cela signifie, c’est que dans votre contrôleur, vous pouvez faire params
et obtenir un joli tableau Ruby de toutes les group_ids
que l’utilisateur a choisies.
Le dernier paramètre garantit simplement que tout groupe auquel l’utilisateur appartient actuellement est coché lorsque le formulaire est rendu.
Ce qui précède devrait vous permettre d’utiliser has_many :through dans votre application Rails, mais en fonction de ce que votre application fait, je suis presque sûr que vous rencontrerez des problèmes qui ne sont pas couverts dans ce post. Donc, si vous êtes toujours coincé, consultez ce qui suit :
1) Consultez cet incroyable casting Rails qui vous emmène à travers toute la gamme d’utilisation de has_many :through. Si ce n’est pas déjà fait, je vous recommande vivement de vous procurer un compte sur RailsCasts.
2) Guide Rails ActiveRecord sur has_many :through
.
Laisser un commentaire