[RUBY] [Rails] Parlez de prêter attention à la valeur de retour de l'endroit

introduction

Pourquoi j'ai écrit

Conclusion

-La valeur de retour de ~~ où et pluck est un tableau ~~ → pluck est renvoyé sous forme de tableau --where renvoie ActiveRecord :: Relation * Ajout 20/11/10 --Comprendre l'utilisation des chaînes de méthodes ActiveRecord

supposition

environnement

・ Rubis 2.6.5 ・ Rails 6.0.3 ・ Utiliser un appareil (modèle utilisateur)

Diagramme ER

スクリーンショット 2020-11-08 18.04.11.png

table de salles: gérer les salles vers DM Table user_rooms: gère les combinaisons utilisateur et pièce

Chose que tu veux faire

スクリーンショット 2020-11-08 16.44.04.png L'image est la table user_rooms.


Ce que vous voulez faire
Je souhaite obtenir les informations utilisateur du partenaire DM (id = 10)
Conditions
La salle à DM est room_id: 2 I (current_user) est user_id: 15

un événement

J'ai essayé de le réaliser avec le code ci-dessous

rooms_controller.rb


class RoomsController < ApplicationController
  def show
      @room = Room.find(params[:id])
      current_user_room = @room.user_rooms.where.not(user_id: current_user.id)
      user_id = current_user_room.user_id
      @user = User.find(user_id)
  end
end

Ligne 3: Définissez @room (id: 2) avec deux utilisateurs participants. Ligne 4: Obtenez la combinaison @room et utilisateur avec @ room.user_rooms. (À ce stade, le nombre d'enregistrements est réduit à deux.) De plus, where.not (user_id: current_user.id) se limite à l'enregistrement qui ne vous inclut pas. 5ème ligne: Parmi les enregistrements obtenus dans la 4ème ligne, nous essayons d'obtenir le user_id.

Cependant, sur la 4ème ligne, l'erreur suivante se produit.

[*] pry(main)> current_user_room.user_id

#résultat
NoMethodError: undefined method `user_id' for #<UserRoom::ActiveRecord_AssociationRelation:0x00007fbef39437e8>

??? Pour le moment, je vais afficher current_user_room

[**] pry(main)> current_user_room

#résultat
=> [#<UserRoom:0x00007fbeefb36518
  id: 2,
  user_id: 10,
  room_id: 2,
  created_at: Sat, 07 Nov 2020 04:00:28 UTC +00:00,
  updated_at: Sat, 07 Nov 2020 04:00:28 UTC +00:00>]

Pourquoi pas moi? Essayez de l'obtenir avec find en utilisant id = 2

[**] pry(main)> user_room1 = UserRoom.find(2)

#résultat
=> #<UserRoom:0x00007fbeec46c960
 id: 2,
 user_id: 10,
 room_id: 2,
 created_at: Sat, 07 Nov 2020 04:00:28 UTC +00:00,
 updated_at: Sat, 07 Nov 2020 04:00:28 UTC +00:00>

Au début, le résultat était le même, mais si vous regardez de près, la current_user_room a [], et elle est dans un tableau ~~. ~~ → Ajout La current_user_room a été obtenue ** par la méthode ** where. ~~ Vous ne pouvez pas l'obtenir en appliquant une chaîne de méthodes à un tableau. Bien sûr, la méthode «where» prend un ensemble de données. ~~ Au fait, j'ai essayé d'obtenir le user_id avec la méthode pluck, mais le résultat était le même.

Solution

~~ Il semble être résolu si vous le récupérez dans le tableau. ~~ Donc [Guide des rails](https://railsguides.jp/active_record_querying.html#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%83%81 % E3% 82% A7% E3% 82% A4% E3% 83% B3% E3% 82% 92% E7% 90% 86% E8% A7% A3% E3% 81% 99% E3% 82% 8B) En y regardant, il semble que la méthode take puisse être utilisée. Je sais que je veux en avoir un.

La méthode take prend un enregistrement. Il ne précise pas quels enregistrements sont récupérés.

rooms_controller.rb


#Code d'origine
current_user_room = @room.user_rooms.where.not(user_id: current_user.id)

#Code correspondant(À la fin.Ajouter une prise)
current_user_room = @room.user_rooms.where.not(user_id: current_user.id).take

Code modifié

rooms_controller.rb


class RoomsController < ApplicationController
  def show
    @room = Room.find(params[:id])
    current_user_room = @room.user_rooms.where.not(user_id: current_user.id).take #.Ajouter une prise
    user_id = current_user_room.user_id
    @user = User.find(user_id)

    @messages = @room.messages.includes(:user)
    @message = Message.new
  end
end

Postscript

Il s'avère que «where» renvoie une instance de «ActiveRecord :: Relation», pas un tableau.

# (where) current_user_Vérifier la classe de la chambre
pry(main)> current_user_room.class
=> UserRoom::ActiveRecord_AssociationRelation

# (find) user_Vérifiez également la chambre1
pry(main)> user_room.class
=> UserRoom(id: integer, user_id: integer, room_id: integer, created_at: datetime, updated_at: datetime)

Je ne suis toujours pas familier avec cela, donc je vais regarder de plus près ActiveRecord et ActiveRecord :: Relation.

en conclusion

Pour le moment, nous avons pris des mesures qui peuvent être prises dans la situation actuelle, mais si nous la réexaminons de fond en comble, il ne sera peut-être même pas nécessaire de la décrire en premier lieu. Je veux le réparer dès que je le remarque. Cependant, cette fois, c'était une bonne étude de pouvoir toucher le comportement de «où». Je voudrais l’améliorer davantage, alors je vous serais reconnaissant de bien vouloir signaler toute lacune ou d’autres méthodes.

Matériel de référence

Guide des rails La différence entre find et where dans ActiveRecord. → J'ai été très utile dans le post-scriptum.

Recommended Posts

[Rails] Parlez de prêter attention à la valeur de retour de l'endroit
Bouton [Rails] pour revenir en haut de la page
9 Correspond à la valeur de retour
[Rails] Où faire attention dans la description de la validation
[Rails] Lire le RSS du site et renvoyer le contenu au premier plan
Faites attention à la vérification des limites de la valeur d'entrée lors de l'utilisation du type float
À propos du cas où "Docker" freeter a tenté de mettre Docker dans l'application Rails existante
[Java] Comment obtenir la valeur maximale de HashMap
[Rails] Comment changer le nom de colonne de la table
Installez plusieurs boutons de soumission dans la vue Rails pour obtenir la valeur du bouton enfoncé
Passez un argument à la méthode et recevez le résultat de l'opération comme valeur de retour
[Rails] Comment obtenir le contenu des paramètres forts
Je veux retourner la position de défilement de UITableView!
Comment spécifier un tableau pour la valeur de retour / l'argument d'une méthode dans le fichier IDL CORBA
Une note sur la fonction de départ de Ruby on Rails
Comment modifier la valeur de réglage de Springboot Hikari CP
[Rails] Comment afficher une liste de messages par catégorie
À propos de la gestion de Null
À propos de la description de Docker-compose.yml
Parlons de l'expérience passagère de Java SE 8 Programmer II
[Rails] Comment obtenir l'URL de la source de transition et la rediriger
Comment afficher 0 sur le côté gauche de la valeur d'entrée standard
La spécification de retour de compareTo peut se permettre sans aller à la référence
[Rails / Heroku / MySQL] Comment réinitialiser la base de données de l'application Rails sur Heroku
[Rails] Comment omettre l'affichage de la chaîne de caractères de la méthode link_to
[Rails] Comment changer le titre de la page du navigateur pour chaque page
[Rails] About Uglifier :: Erreur: jeton inattendu: au moment du déploiement
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Comment incrémenter la valeur de Map sur une ligne en Java
À propos du comportement de ruby Hash # ==
À propos des bases du développement Android
[Rails] Vérifiez le contenu de l'objet
À propos du symbole <%%> dans Rails erb
Explication de l'ordre des itinéraires ferroviaires
[Rails] À propos de la mise en œuvre de la fonction similaire
Vérifier l'état de migration des rails
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
À propos du niveau de journalisation de java.util.logging.Logger
Comment sortir la somme de trois nombres, à l'exclusion de la même valeur
[Rails] J'ai découvert les fichiers de migration! (Ajout d'une colonne au tableau)
Parlez des mérites des variables de liaison de base de données (② Mérite: Prévention de l'injection SQL)
Comment renvoyer une valeur du modèle au contrôleur en utilisant le protocole [Swift5]
Comment décorer CSS sur les boutons radio de rails6 form_with (helper)
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
[Ruby] Je souhaite extraire uniquement la valeur du hachage et uniquement la clé
Fonction Strict_loading pour supprimer l'occurrence de problème N + 1 ajoutée à partir des rails 6.1
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
[Rails] Utilisez le dispositif pour obtenir des informations sur l'utilisateur actuellement connecté
Comment résoudre la construction de l'environnement local de Ruby on Rails (MAC)!
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
[Rails] La cause de l'impossibilité de publier des messages était form_with
Développement Android, comment vérifier null dans la valeur de l'objet JSON