.id
gehen."-Der Rückgabewert von ~~ wobei und Zupfen ein Array ist ~~ → Zupfen wird als Array zurückgegeben --where gibt ActiveRecord :: Relation * zurück Addition 20/11/10
・ Ruby 2.6.5 ・ Schienen 6.0.3 ・ Verwenden Sie devise (Benutzermodell)
Zimmertisch: Zimmer nach DM verwalten Tabelle user_rooms: Verwaltet Benutzer- und Raumkombinationen
Das Bild ist die Tabelle user_rooms.
Was Sie tun möchten
Ich möchte die Benutzerinformationen des DM-Partners erhalten (id = 10).
Bedingungen
Der Raum zu DM ist room_id: 2
I (current_user) ist user_id: 15
Ich habe versucht, es mit dem folgenden Code zu realisieren
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
Zeile 3: Definieren Sie @room (ID: 2) mit zwei teilnehmenden Benutzern.
Zeile 4: Holen Sie sich die Kombination aus @room und Benutzer mit @ room.user_rooms
. (Zu diesem Zeitpunkt wird die Anzahl der Datensätze auf zwei reduziert.) Außerdem wird "where.not (user_id: current_user.id)" auf den Datensatz eingegrenzt, der Sie nicht enthält.
5. Zeile: Von den in der 4. Zeile erhaltenen Datensätzen versuchen wir, die user_id abzurufen.
In der 4. Zeile tritt jedoch der folgende Fehler auf.
[*] pry(main)> current_user_room.user_id
#Ergebnis
NoMethodError: undefined method `user_id' for #<UserRoom::ActiveRecord_AssociationRelation:0x00007fbef39437e8>
???
Vorerst werde ich current_user_room
ausgeben
[**] pry(main)> current_user_room
#Ergebnis
=> [#<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>]
Warum kann ich nicht? Versuchen Sie es mit find
mit id = 2 zu bekommen
[**] pry(main)> user_room1 = UserRoom.find(2)
#Ergebnis
=> #<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>
Zuerst sah das Ergebnis gleich aus, aber wenn Sie genau hinschauen, hat der current_user_room`` []
und befindet sich in einem Array ~~. ~~ → Ergänzung
Der current_user_room
wurde ** durch die ** where
Methode erhalten.
~~ Sie können es nicht erhalten, indem Sie eine Methodenkette auf ein Array anwenden. Natürlich nimmt die "where" -Methode einen Datensatz auf. ~~
Übrigens habe ich versucht, die "user_id" mit der "pluck" -Methode zu erhalten, aber das Ergebnis war das gleiche.
~~ Es scheint gelöst zu sein, wenn Sie es aus dem Array aufnehmen. ~~ Also [Rails Guide](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) Wenn man es betrachtet, scheint es, dass die "take" -Methode verwendet werden kann. Ich weiß, ich möchte einen bekommen.
Die Take-Methode nimmt einen Datensatz auf. Es wird nicht angegeben, welche Datensätze abgerufen werden.
rooms_controller.rb
#Originalcode
current_user_room = @room.user_rooms.where.not(user_id: current_user.id)
#Entsprechender Code(Am Ende.Add take)
current_user_room = @room.user_rooms.where.not(user_id: current_user.id).take
[0]
hinzufügen, um das erste Element des Arrays am Ende zu erhalten.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 #.Add take
user_id = current_user_room.user_id
@user = User.find(user_id)
@messages = @room.messages.includes(:user)
@message = Message.new
end
end
Es stellt sich heraus, dass where
eine Instanz von ActiveRecord :: Relation
zurückgibt, kein Array.
# (where) current_user_Überprüfen Sie die Raumklasse
pry(main)> current_user_room.class
=> UserRoom::ActiveRecord_AssociationRelation
# (find) user_Überprüfen Sie auch Raum1
pry(main)> user_room.class
=> UserRoom(id: integer, user_id: integer, room_id: integer, created_at: datetime, updated_at: datetime)
Ich bin immer noch nicht damit vertraut, daher werde ich mir "ActiveRecord" und "ActiveRecord :: Relation" genauer ansehen.
Vorerst haben wir Maßnahmen ergriffen, die in der gegenwärtigen Situation ergriffen werden können. Wenn wir sie jedoch von Grund auf überprüfen, ist es möglicherweise nicht einmal erforderlich, dies überhaupt zu beschreiben. Ich möchte es reparieren, sobald ich es bemerke. Diesmal war es jedoch eine gute Studie, das Verhalten von "wo" berühren zu können. Ich würde es gerne weiter verbessern, daher würde ich es begrüßen, wenn Sie auf Mängel oder andere Methoden hinweisen könnten.
Rails Guide Der Unterschied zwischen find und where in ActiveRecord. → Ich war im Postscript sehr hilfreich.
Recommended Posts