[RUBY] LIMIT 11, wenn Daten mit irb erfasst werden

Normalerweise benutze ich Pry, also habe ich es überhaupt nicht bemerkt, aber irgendwann bin ich auf ein Ereignis gestoßen, bei dem bei der Verwendung von irb ein Rätsel um "Limit 11" hinzugefügt wurde.

Was ist "LIMIT 11"? Ich konnte nicht anders, also war ich schlampig, aber ich weiß nicht ... ich mache mir Sorgen. Ich war wirklich neugierig, also habe ich nachgeschlagen und herausgefunden, warum "LIMIT 11" angehängt ist, also habe ich einen Artikel geschrieben.

Bestätigung des Ereignisses

Angenommen, Sie haben ein solches Modell.

class User < ApplicationRecord
  has_many :reviews
end

class Review < ApplicationRecord
  belongs_to :user
end

Lassen Sie uns den Prozess ausführen, um die Bewertungen zu erhalten, die der Benutzer mit irb hat.

irb(main):006:0> user = User.find 1
  User Load (0.6ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User id: 1, name: "1234567890", created_at: "2019-12-12 05:43:52", updated_at: "2019-12-12 05:43:52">
irb(main):007:0> user.reviews
  Review Load (1.0ms)  SELECT `reviews`.* FROM `reviews` WHERE `reviews`.`user_id` = 1 LIMIT 11
=> #<ActiveRecord::Associations::CollectionProxy [#<Review id: 1, content: "hoge", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:27:55", updated_at: "2020-06-11 05:27:55">, #<Review id: 2, content: "fuga", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:12", updated_at: "2020-06-11 05:45:12">, #<Review id: 3, content: "fuga1", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:14", updated_at: "2020-06-11 05:45:14">, #<Review id: 4, content: "fuga12", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:15", updated_at: "2020-06-11 05:45:15">, #<Review id: 5, content: "fuga123", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:17", updated_at: "2020-06-11 05:45:17">, #<Review id: 6, content: "fuga1234]", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:18", updated_at: "2020-06-11 05:45:18">, #<Review id: 7, content: "fuga12345", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:20", updated_at: "2020-06-11 05:45:20">, #<Review id: 8, content: "fuga123456", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:22", updated_at: "2020-06-11 05:45:22">, #<Review id: 9, content: "fuga1234567", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:24", updated_at: "2020-06-11 05:45:24">, #<Review id: 10, content: "fuga12345678", user_id: 1, book_id: 0, status: "draft", created_at: "2020-06-11 05:45:27", updated_at: "2020-06-11 05:45:27">, ...]>
irb(main):008:0>

Es kommt mit LIMIT 11! Wussten Sie, wo es war? Beachten Sie die Abfrage von user.reviews. Ich werde das Bild des relevanten Teils auf ↓ setzen. スクリーンショット 2020-06-11 18.03.38.png

Warum ist es nicht "LIMIT 11", obwohl ich nichts getan habe? Hier beginnt die Reise zur Untersuchung der Ursache.

Suche nach "LIMIT 11" aus dem Rails-Repository

Ich habe mich gefragt, ob Rails etwas unternimmt, also habe ich ehrlich das Rails-Repository auf Github nach "LIMIT 11" durchsucht. スクリーンショット 2020-06-11 18.16.27.png

Es wurden 35 Gegenstände gefunden. Es ist ein Level, das Sie visuell erreichen können. Wenn Sie also einen kurzen Blick darauf werfen, ...

Es gab so einen Code! スクリーンショット 2020-06-11 18.20.18.png

Veröffentlichte die entsprechende Methode (Link zu Github hier)

activerecord/lib/active_record/relation.rb


def inspect
  subject = loaded? ? records : self
  entries = subject.take([limit_value, 11].compact.min).map!(&:inspect)

  entries[10] = "..." if entries.size == 11

  "#<#{self.class.name} [#{entries.join(', ')}]>"
end

Ich denke, es kommt mit dem Namen der Methode, aber es scheint, dass "LIMIT 11" hinzugefügt wird, wenn "inspect" verwendet wird. Betrachtet man die Verarbeitung, so scheinen 10 Daten zurückgegeben zu werden und das 11. Teil wird in "..." geändert.

Übrigens, wenn Sie "inspect" nicht kennen, lesen Sie bitte hier.

Gibt eine Zeichenfolge von Objekten zurück, die in ein für Menschen lesbares Format konvertiert wurden.

Diese Methode wird häufig beim Debuggen verwendet.

Ich habe festgestellt, dass selbst mit dem vertrauten Preis, wenn Sie "inspect" hinzufügen, "LIMIT 11" ausgegeben wird.

[12] pry(main)> user = User.find 1
  User Load (0.6ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User:0x00005599999f28a0
 id: 1,
 name: "1234567890",
 created_at: Thu, 12 Dec 2019 05:43:52 UTC +00:00,
 updated_at: Thu, 12 Dec 2019 05:43:52 UTC +00:00>
[13] pry(main)> user.reviews.inspect
  Review Load (0.6ms)  SELECT `reviews`.* FROM `reviews` WHERE `reviews`.`user_id` = 1 LIMIT 11
=> "#<ActiveRecord::Associations::CollectionProxy [#<Review id: 1, content: \"hoge\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:27:55\", updated_at: \"2020-06-11 05:27:55\">, #<Review id: 2, content: \"fuga\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:12\", updated_at: \"2020-06-11 05:45:12\">, #<Review id: 3, content: \"fuga1\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:14\", updated_at: \"2020-06-11 05:45:14\">, #<Review id: 4, content: \"fuga12\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:15\", updated_at: \"2020-06-11 05:45:15\">, #<Review id: 5, content: \"fuga123\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:17\", updated_at: \"2020-06-11 05:45:17\">, #<Review id: 6, content: \"fuga1234]\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:18\", updated_at: \"2020-06-11 05:45:18\">, #<Review id: 7, content: \"fuga12345\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:20\", updated_at: \"2020-06-11 05:45:20\">, #<Review id: 8, content: \"fuga123456\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:22\", updated_at: \"2020-06-11 05:45:22\">, #<Review id: 9, content: \"fuga1234567\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:24\", updated_at: \"2020-06-11 05:45:24\">, #<Review id: 10, content: \"fuga12345678\", user_id: 1, book_id: 0, status: \"draft\", created_at: \"2020-06-11 05:45:27\", updated_at: \"2020-06-11 05:45:27\">, ...]>"
[14] pry(main)>

Wiederum bedeutet "inspect" "eine Zeichenfolge von Objekten zurückgeben, die in ein für Menschen lesbares Format konvertiert wurden". Selbst wenn eine große Datenmenge ausgegeben wird, möchte ich sie natürlich nicht visuell lesen, sodass die Anzeige von bis zu 10 Teilen gesteuert wird.

Bisher habe ich so etwas gefunden, aber es ist noch keine Lösung. Weil in irb aus irgendeinem Grund "LIMIT 11" angehängt ist, obwohl "inspect" nicht angehängt ist.

irb LIMIT 11

Als nächstes konzentrieren wir uns auf das Ausgabeergebnis, wenn der Befehl mit irb ausgeführt wird. Die Anzeige der 11. Daten nach "LIMIT 11" wird in "..." konvertiert. Dies ist genau das Verhalten der Inspektion, die ich zuvor untersucht habe.

Also, als ich mit "irb" und "inspect" herumging, スクリーンショット_2020-06-11_23_05_36.png

Verwenden Sie Inspect for result output! Als ich sofort darauf klickte, wurde es wie folgt geschrieben. https://docs.ruby-lang.org/ja/latest/library/irb.html#inspect_mode

Sie können die Ergebnisausgabemethode ändern, indem Sie einen der folgenden Werte in conf.inspect_mode in der irb-Eingabeaufforderung und in IRB.conf [: INSPECT_MODE] in der .irbrc festlegen. false, :to_s, :raw Das Ausgabeergebnis to_s wird angezeigt. true, :p, :inspect Das überprüfte Ausgabeergebnis wird angezeigt. :pp, :pretty_inspect Das Ausgabeergebnis wird als hübsche_inspektion angezeigt. :yaml, :YAML Zeigt das Ausgabeergebnis im YAML-Format an. :marshal, :Marshal, :MARSHAL, Marshal Das Ausgabeergebnis wird als Marschall angezeigt. # Dump.

Wenn ich den Standardwert sofort überprüfe,

irb(main):004:0> conf.inspect_mode
=> true

"Zeigt das überprüfte Ausgabeergebnis an." Aufgrund dieses Effekts scheint "inspect" immer angehängt zu sein, auch wenn "inspect" nicht hinzugefügt wird.

Ich habe es mit einer anderen Einstellung versucht (: pretty_inspect).

irb(main):010:0> conf.inspect_mode = :pp
=> :pp
- !ruby/object:Review
  concise_attributes:
irb(main):012:0> user = User.find 1
  User Load (0.8ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
=> #<User:0x000055fcbd833780
 id: 1,
 name: "1234567890",
 created_at: Thu, 12 Dec 2019 05:43:52 UTC +00:00,
 updated_at: Thu, 12 Dec 2019 05:43:52 UTC +00:00>
irb(main):013:0> user.reviews
  Review Load (0.8ms)  SELECT `reviews`.* FROM `reviews` WHERE `reviews`.`user_id` = 1
=> [#<Review:0x000055fcbd87b120
  id: 1,
  content: "hoge",
  user_id: 1,
  book_id: 0,
  status: "draft",
  created_at: Thu, 11 Jun 2020 05:27:55 UTC +00:00,
  updated_at: Thu, 11 Jun 2020 05:27:55 UTC +00:00>,
 #<Review:0x000055fcbd87af68
  id: 2,
・ ・ ・ (Weggelassen, weil es lang ist)

Es scheint, dass "LIMIT 11" nicht angehängt ist.

Damit ist die Untersuchung abgeschlossen. Es wird erfrischend sein, wenn Sie die Ursache richtig verstehen!

Zusammenfassung

Als Ergebnis dieser Untersuchung ist die Ursache für "LIMIT 11, wenn Daten von irb erfasst werden"

war.

Es könnte in Zukunft ein nützliches Ergebnis gewesen sein, festzustellen, dass "hübsch_inspekt" in irb leichter zu sehen ist als "inspizieren" als die Ursache von "LIMIT 11".

Recommended Posts

LIMIT 11, wenn Daten mit irb erfasst werden
Talend WebAPI-Lösung für Komponenten, die Cookies speichern, wenn Daten abgerufen werden
Absturz beim Löschen von Realm-Daten, die von Swift aufgelistet werden: Index 1 ist außerhalb der Grenzen
Wenn die von Name.com erworbene Domain plötzlich unbrauchbar wird
Wenn der Monat des Datums erfasst wird, verschiebt sich der Januar
Memo zur Datenerfassungsmethode, wenn HashMap in HashMap vorhanden ist
Spring-Batch wird automatisch registriert, wenn ein Listener mit Reader usw. implementiert wird.
[App-Gruppen] Was ist zu überprüfen, wenn auf UserDefaults-Daten nicht zugegriffen werden kann?
% Rails DB: Beim Erstellen ist der durch Mimemagic verursachte LoadError
Ein Memorandum, wenn Sie die von Jena & SPARQL erfassten Daten für jede Variable anzeigen möchten.