.id
", avec le sens des remords pour avoir abusé d'ActiveRecord-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
・ Rubis 2.6.5 ・ Rails 6.0.3 ・ Utiliser un appareil (modèle utilisateur)
table de salles: gérer les salles vers DM Table user_rooms: gère les combinaisons utilisateur et pièce
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
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.
~~ 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
[0]
pour obtenir le premier élément du tableau à la fin.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
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
.
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.
Guide des rails La différence entre find et where dans ActiveRecord. → J'ai été très utile dans le post-scriptum.
Recommended Posts