Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut

Fazit: Sie können den Attributnamen verwenden? Statt leer? Und vorhanden? (Einige müssen vorsichtig sein.)

Hintergrund: Ich wollte ein Array von ganzen Zahlen hinzufügen (möglicherweise null).

Original mein Code ...

[Hier ist eine Reihe von Objekten mit hoge als Schlüssel].reject(|obj| !obj.hoge.nil?).sum(:hoge)

reject(|obj| !obj.hoge.nil?)In hoge entfernt null,sum(:hoge)Ich wollte Hoge hinzufügen, ohne dass etwas entfernt wurde.

Geänderte Version

[Hier ist eine Reihe von Objekten mit hoge als Schlüssel].select(&:hoge?).sum(:hoge)

reject(|obj| !obj.hoge.nil?)Aberselect(&:hoge?)wurde. Ich habe versucht, die auszuwählen, die hoge? Als wahr bewertet. Dies habe ich diesmal gelernt. Ist es möglich, den Attributnamen auszudrücken?

Kommentar

Ähnlicher Artikel existiert bereits Mein ursprünglicher Code scheint ein schlechter Code für schlechten Geruch gewesen zu sein. (Referenzseite)

Ich habe mir auch [Rails-Bodycode] angesehen (https://github.com/rails/rails/blob/7834363bbfdb68d734143063932ccc5a8814c97f/activerecord/lib/active_record/attribute_methods/query.rb). Diese Fallbeschreibung scheint der relevante Teil zu sein. Um die Fallaussage zusammenzufassen, ...

Erstens ist wahr wahr, falsch, null ist falsch.

when true        then true
when false, nil  then false

Als nächstes scheint es, dass der Empfänger grob in Fälle mit und ohne das angegebene Attribut unterteilt werden kann.

if !type_for_attribute(attr_name) { false }
  if Numeric === value || !value.match?(/[^0-9]/)
    !value.to_i.zero?
  else
    return false if ActiveModel::Type::Boolean::FALSE_VALUES.include?(value)
    !value.blank?
  end
elsif value.respond_to?(:zero?)
  !value.zero?
else
  !value.blank?
end

! Type_for_attribute (attr_name) {false} ist true, wenn der Empfänger nicht über den entsprechenden Attributnamen verfügt. Außerdem,Numeric === value || !value.match?(/[^0-9]/)Im Falle von(Zahlen), 0 ist falsch, sonst ist es wahr. Wenn es sich nicht um eine Zahl handelt, wird false zurückgegeben, wenn sie falsch ist, und leer, wenn dies nicht der Fall ist.

Als nächstes hat der Empfänger den entsprechenden Attributnamen. Wenn value.respond_to? (: Null?) Hat Null ?, Wird ! Value.zero? Als falsch ausgewertet, wenn es 0 ist, andernfalls ist es wahr. Wenn Sie keine Null haben, scheint das Ergebnis von! Value.blank? Zurückgegeben zu werden.

Zusammenfassung

Ich dachte, es könnte anstelle von attribute name.blank? Oder attribute name.present? In vielen Fällen verwendet werden. Ich möchte vorsichtig sein, dass es falsch wird, wenn es 0 ist. Es wurde auch in [Referenzartikel] erwähnt (https://qiita.com/yusabana/items/67ae553824166a39b61e). Was ich tun wollte, war einfach zu addieren, so dass es kein Problem wäre, wenn 0 gespielt würde, aber ich dachte, dass es in einigen Fällen ein Problem sein könnte.

Vielen Dank, dass Sie so weit gelesen haben. Bitte weisen Sie auf Fehler hin und wir werden sie korrigieren. (Dieser Artikel hat nichts mit der Firma zu tun)

Recommended Posts

Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut
[Ruby on Rails] Bis zur Einführung von RSpec
[Ruby on Rails] Leseversuch (: [],: Schlüssel)
Grundkenntnisse in Ruby on Rails
[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
(Ruby on Rails6) Anzeige der Datenbank, die die ID der Datenbank erhalten hat
Alle Inhalte der Listenseite löschen [Ruby on Rails]
Ein Hinweis zum Seed-Feature von Ruby on Rails
[Rails] Hinzufügen der Ruby On Rails-Kommentarfunktion
Versuchen Sie, || anstelle des ternären Operators zu verwenden
[Ruby on Rails] Codeprüfung mit Rubocop-Airbnb
Versuchen Sie, den Dienst auf Android Oreo zu verwenden
[Ruby on Rails] Ändere das Speicherziel von Gem Refile * Hinweis
Hinweise zur Verwendung von FCM mit Ruby on Rails
[Ruby on Rails] Japanische Fehlernotation
Erklärung von Ruby auf Schienen für Anfänger ①
[Ruby on Rails] Implementierung einer ähnlichen Funktion
Erstellen Sie mit der Datei Ruby on Rails seeds.rb eine große Anzahl von Datensätzen mit einem einzigen Befehl
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
Implementierung der Ruby on Rails-Anmeldefunktion (Sitzung)
Wenn das Ruby on Rails-Terminal zurückrollt
Empfehlung der Serviceklasse in Ruby on Rails
Veröffentlichen Sie die mit Ruby on Rails erstellte App
Ruby on Rails ~ Grundlagen von MVC und Router ~
[Ruby on Rails] Ein Memorandum mit Layoutvorlagen
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
[Ruby on Rails] Individuelle Anzeige von Fehlermeldungen
Ruby on Rails Elementary
Ruby on Rails Grundlagen
Ruby On Rails Association
[Ruby on Rails] So machen Sie das Linkziel zu einem Teil der angegebenen ID
[Ruby on Rails] Implementieren Sie ein Kreisdiagramm, das den Prozentsatz der Farben angibt
[Ruby on Rails] So japanisieren Sie die Fehlermeldung des Formularobjekts (ActiveModel)
[Ruby on Rails] Asynchrone Kommunikation der Posting-Funktion, Ajax
[Einführung] Erstellen Sie eine Ruby on Rails-Anwendung
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
[Ruby on Rails] So ändern Sie den Spaltennamen
[Ruby on Rails] Gemeinsame Verarbeitung zwischen Controllern (unter Verwendung von Konkaven)
Rails6: Geben Sie die Anfangsdaten von ActionText mit seed ein
Erklärung von Ruby auf Schienen für Anfänger ⑥ ~ Erstellung der Validierung ~
Erklärung von Ruby on Rails für Anfänger ② ~ Links erstellen ~
(Ruby on Rails6) Reflektiert den veröffentlichten Inhalt aus dem Formular
Erklärung von Ruby on Rails für Anfänger ⑦ ~ Flash-Implementierung ~
[Ruby on Rails] Implementierung einer Validierung, die nur funktioniert, wenn die Bedingungen erfüllt sind
Ruby on Rails Lernrekord -2020.10.03
Portfolioerstellung Ruby on Rails
Ruby on Rails Lernrekord -2020.10.04
Versuchen Sie es mit Cocoa von Ruby
[Ruby on Rails] Debuck (bindend.pry)