[RUBY] [Rails] Sprechen Sie darüber, wie Sie auf den Rückgabewert von where achten

Einführung

Warum ich geschrieben habe

Fazit

-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

Annahme

Umgebung

・ Ruby 2.6.5 ・ Schienen 6.0.3 ・ Verwenden Sie devise (Benutzermodell)

ER-Diagramm

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

Zimmertisch: Zimmer nach DM verwalten Tabelle user_rooms: Verwaltet Benutzer- und Raumkombinationen

Was du machen willst

スクリーンショット 2020-11-08 16.44.04.png 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

Veranstaltung

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.

Lösung

~~ 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

Geänderter Code

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

Nachtrag

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.

abschließend

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.

Referenzmaterial

Rails Guide Der Unterschied zwischen find und where in ActiveRecord. → Ich war im Postscript sehr hilfreich.

Recommended Posts

[Rails] Sprechen Sie darüber, wie Sie auf den Rückgabewert von where achten
Schaltfläche [Schienen], um zum Anfang der Seite zurückzukehren
9 Entspricht dem Rückgabewert
[Rails] Bei der Beschreibung der Validierung ist Vorsicht geboten
[Rails] Lesen Sie das RSS der Site und geben Sie den Inhalt an die Vorderseite zurück
Achten Sie bei Verwendung des Float-Typs auf die Grenzprüfung des Eingabewerts
Über den Fall, in dem der Freeter "Docker" versucht hat, Docker in die vorhandene Rails-Anwendung einzufügen
[Java] So erhalten Sie den Maximalwert von HashMap
[Rails] So ändern Sie den Spaltennamen der Tabelle
Installieren Sie mehrere Senden-Schaltflächen in der Rails-Ansicht, um den Wert der gedrückten Schaltfläche abzurufen
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
[Rails] So erhalten Sie den Inhalt starker Parameter
Ich möchte die Bildlaufposition von UITableView zurückgeben!
So geben Sie ein Array für den Rückgabewert / das Rückgabeargument einer Methode in der CORBA IDL-Datei an
Ein Hinweis zum Seed-Feature von Ruby on Rails
So ändern Sie den Einstellwert von Springboot Hikari CP
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
Über den Umgang mit Null
Informationen zur Beschreibung von Docker-compose.yml
Lassen Sie uns über die vorübergehende Erfahrung von Java SE 8 Programmer II sprechen
[Rails] So erhalten Sie die URL der Übergangsquelle und leiten sie um
So zeigen Sie 0 auf der linken Seite des Standardeingabewerts an
Die Rückgabespezifikation von compareTo kann es sich leisten, ohne auf die Referenz zuzugreifen
[Rails / Heroku / MySQL] So setzen Sie die Datenbank der Rails-App auf Heroku zurück
[Rails] So lassen Sie die Anzeige der Zeichenfolge der link_to-Methode weg
[Schienen] So ändern Sie den Seitentitel des Browsers für jede Seite
[Rails] Über Uglifier :: Fehler: Unerwartetes Token: Zum Zeitpunkt der Bereitstellung
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
So erhöhen Sie den Wert von Map in einer Zeile in Java
Über das Verhalten von Ruby Hash # ==
Über die Grundlagen der Android-Entwicklung
[Schienen] Überprüfen Sie den Inhalt des Objekts
Über das Symbol <%%> in Rails erb
Erläuterung der Reihenfolge der Schienenrouten
[Rails] Über die Implementierung der Like-Funktion
Überprüfen Sie den Migrationsstatus von Schienen
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Informationen zur Protokollebene von java.util.logging.Logger
So geben Sie die Summe von drei beliebigen Zahlen ohne denselben Wert aus
[Rails] Ich habe etwas über Migrationsdateien gelernt! (Hinzufügen einer Spalte zur Tabelle)
Sprechen Sie über die Vorteile von Datenbankbindungsvariablen (② Verdienst: Verhinderung der SQL-Injection)
Zurückgeben eines Werts vom Modell an den Controller mithilfe des [Swift5] -Protokolls
So dekorieren Sie CSS auf Rails6 form_with (Hilfs-) Optionsfeldern
Schritte zum Ausführen von Spring Boot beziehen sich auf die Werte in der Eigenschaftendatei
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Strict_loading-Funktion zur Unterdrückung des Auftretens von N + 1-Problemen, die von Schienen hinzugefügt wurden 6.1
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
[Rails] Verwenden Sie devise, um Informationen zum aktuell angemeldeten Benutzer abzurufen
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
[Rails] Die Ursache dafür, dass nicht gepostet werden konnte, war in form_with
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft