[RUBY] Ein aktiver Hash, der als Daten behandelt werden kann, auch wenn er nicht in der Datenbank enthalten ist

Einführung

Eine Funktion, mit der Sie eine Präfektur aus dem Pulldown-Menü auswählen können, die häufig in Fragebögen angezeigt wird. , Sie können die Möglichkeit haben, mit der Methode form_with zu posten. Es ist jedoch einfacher, die Präfektur zu verwenden, wenn sie numerisch in der Tabelle verwaltet wird. Um mit numerischen Werten umgehen zu können, müssen der Name der Präfektur und die damit verbundene Nummer im Voraus vorbereitet werden. ActiveHash ist in solchen Fällen eine bequeme Funktion.

Was ist Active Hash?

Gem, mit dem Sie Daten verarbeiten können, ohne sie in der Datenbank zu speichern, indem Sie Daten eingeben, die sich im Modell grundsätzlich nicht ändern. Wird hauptsächlich verwendet, wenn Sie in der Ansicht als Pulldown-Menü angezeigt werden möchten.

Das offizielle Dokument ist hier

Ablauf der Vorbereitung

  1. Beschreibung des Edelsteins
  2. Installieren Sie Gem
  3. Generieren Sie ein Modell

1. Beschreibung des Edelsteins

OK in der untersten Zeile der Datei

Gemfile


gem 'active_hash'

2. Installieren Sie Gem

% bundle install

3. Generieren Sie ein Modell

%Schienen g Modell Modellname--skip-migration

Der Modellname sollte so sein, dass die Pulldown-Menüs zusammengefasst sind. ex) Baseball, Fußball, Tennis ... Beim Erstellen eines Pulldown-ähnlichen Namens lautet der Modellname "Sport".

Durch Hinzufügen der Option --skip-migration wird die Migrationsdatei nicht generiert. ActiveHash wird nicht in der Datenbank gespeichert, daher ist keine Migrationsdatei erforderlich.

Im Folgenden wird das Pulldown-Menü des Sports als Beispiel beschrieben.

Fluss von der Beschreibung zur Anzeige

  1. Klassen definieren und erben
  2. Beschreiben Sie die Elemente im Pulldown-Menü
  3. Beschreiben Sie die Zuordnung
  4. Beschreiben Sie die Validierung
  5. Pulldown-Menü anzeigen

4. Klassen definieren und erben

Ändern Sie das in "3. Modellgenerierung" erstellte Modell in die folgende Beschreibung.

app/models/sport.rb


class Sport < ActiveHash::Base
  self.data = []
end

Durch das Erben von ActiveHash :: Base können ActiveRecord-Methoden verwendet werden.

5. Beschreiben Sie die Elemente im Pulldown-Menü

Hash den Inhalt des Pulldowns in das Array.

app/models/sport.rb


class Sport < ActiveHash::Base
  self.data = [
    { id: 1, name: '---' },
    { id: 2, name: 'Baseball' },
    { id: 3, name: 'Soccer' },
    { id: 4, name: 'Tennis' }
  ]
end

6. Beschreiben Sie die Zuordnung

Nachfolgend finden Sie eine Erläuterung der Annahme, dass bereits eine Tabelle zum Speichern eines anderen Beitrags vorhanden ist.

app/models/post.rb


class Post < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
    belongs_to_active_hash :sport
end

Die Beschreibung von "Erweitern von ActiveHash :: Associations :: ActiveRecordExtensions" ermöglicht die Verwendung der "Gehört_zu_aktiven_Hash-Methode".

Assoziationen im Sportmodell müssen nicht beschrieben werden.

* Beachten Sie, dass sich die Beschreibung von der normalen Zuordnung </ font> unterscheidet

7. Beschreiben Sie die Validierung

app/models/post.rb


class Post < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
    belongs_to_active_hash :sport

  validates :sport_id, presence: true #Leerer Beitrag kann nicht gespeichert werden

  
  validates :sport_id, numericality: { other_than: 1 } 
                        #Die Pulldown-Auswahl lautet "--Kann nicht gespeichert werden, wenn
end

8. Pulldown-Menü anzeigen

collection_select-Methode


collection_select(Spaltenname, der gespeichert werden soll,Array von Objekten,In Spalten gespeicherte Elemente,Spaltenname wird in den Optionen angezeigt,Möglichkeit,HTML-Option)
collection_select(:sport_id, Sport.all, :id, :name, {}, {class:"sport-select"})

Zu speichernder Spaltenname: In welcher Spalte der zu speichernden Tabelle. Array von Objekten: Wenn Sie den gesamten Hash des Arrays anzeigen möchten, können Sie .all verwenden. In der Spalte gespeicherte Elemente: In app / models / sport.rb möchte ich den Teil, der id: war, in der Spalte speichern. Spaltenname, der in den Optionen angezeigt wird: Zeigen Sie den Teil von app / models / sport.rb an, der im Pulldown-Menü als name: festgelegt wurde. Optional: nach Bedarf HTML-Option: Klassenname usw.

Schließlich

Auf jeden Fall hat die collection_select-Methode zu viele Argumente, was verwirrend sein kann ...

Recommended Posts

Ein aktiver Hash, der als Daten behandelt werden kann, auch wenn er nicht in der Datenbank enthalten ist
Fortsetzung ・ Aktiver Hash, der als Daten behandelt werden kann, auch wenn er nicht in der Datenbank enthalten ist ~ Anzeige
Verarbeitung, wenn eine ID, die nicht in der Datenbank vorhanden ist, in die URL eingegeben wird
Selbst wenn ich die Einstellung von STRICT_QUOTE_ESCAPING in CATALINA_OPTS in tomcat8.5 schreibe, wird sie nicht wiedergegeben.
Obwohl der Pfad der Eigenschaftendatei in der Option -cp angegeben ist, wird er nicht als Klassenpfad erkannt.
Wenn Sie die Fehlermeldung erhalten Die Daten können nicht gelesen werden, da sie im Docker für Mac fehlen
[Rails] Wenn CSS in collection_select nicht angewendet wird, prüfen Sie, ob Sie die Klasse angeben können.
Speichern Sie die Daten, die von JavaFX gelesen werden können, als PNG
[Rails] Das Textlicht von Bootstrap kann nicht von der link_to-Methode geerbt werden, da die Klasse nicht als Argument in der Methode geschrieben ist.
Das in JAVA_HOME festgelegte JDK-Problem tritt auch dann nicht auf, wenn die Java-Version an der Eingabeaufforderung ausgeführt wird
Gibt es eine Instanz, auch wenn der Konstruktor ausfällt?
[Quarkus] Eine Falle, die nicht funktioniert, selbst wenn Sie das GCP Pub / Sub-Beispiel so wie es ist kopieren und einfügen
Es funktioniert nicht, wenn der Map-Schlüssel ein Array ist
Der Fall, dass @Autowired in JUnit5 nicht verwendet werden konnte
[Firebase] Firebase Auth currentUser wird auch nach der Deinstallation der App nicht null
Das Problem, dass "Antwortzeit zu lang ist" in der ursprünglichen Domäne behoben, obwohl IP-Adresse und EC2-Adresse auf der Site eingegeben werden können, wurde behoben.
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Like-Funktion Der Teil, der feststeckt, um es asynchron zu machen
Es scheint, dass Java 14 Datenklassen-ähnliche Funktionen hinzufügen wird
Es sollte mit dem Beispiel identisch sein, wenn Sie sich bei Twitter anmelden, es tritt jedoch ein Fehler auf, bis die Lösung behoben ist
Pay.JP-Lösung, wenn sie lokal funktioniert, aber in der Produktionsumgebung nicht gut funktioniert
Sind Sie noch erschöpft von der Implementierung der Suchfunktion? Gem'ransack ', der sofort implementiert werden kann
Ich habe die gleiche Beschreibung wie eine Methode unter privat im Rails-Controller getrennt und implementiert, damit sie mit before_action aufgerufen werden kann
Daten sind nicht in Rails registriert.
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
[Schienen] Über den Fehler, dass das Bild nicht in der Produktionsumgebung angezeigt wird
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
Die Geschichte, dass das Servlet nicht in die Java-Webanwendung geladen werden konnte
Das Phänomen, dass Sie sich nicht abmelden können, obwohl es in devise beschrieben ist
[Android Studio] Beschreibung, die kontinuierlich in die SQLite-Datenbank eingegeben werden kann [Java]
Eine Geschichte, die unter einem Raum litt, der nicht verschwindet, selbst wenn er mit Java beschnitten ist
Wenn die JDK-Version in Eclipse korrekt ist, aber ein Fehler auftritt oder der Compiler nicht ordnungsgemäß funktioniert