[Ruby on Rails] Implementieren Sie ein Kreisdiagramm, das den Prozentsatz der Farben angibt

Ich persönlich erstelle so etwas wie eine "Schrank-App", mit der ich meine eigenen Klamotten verwalten kann. Ich denke, dass ich es will und dass es interessant wäre, es zu machen. Daher dachte ich, es wäre großartig, wenn ich das Farbverhältnis meiner Kleidung in einem leicht verständlichen Kreisdiagramm anzeigen könnte, also habe ich es dieses Mal implementiert.

Entwicklungsumgebung

Ruby 2.5.1p57 Rails 5.2.4.4 Verwenden Sie Edelstein ・ Active_hash ・ Chartkick ・ Diagrammfähig

Ich werde es tatsächlich schaffen

Ich war sehr besorgt darüber, wo ich die tatsächlichen Farbdaten dieses Mal haben sollte, aber ich entschied mich, active_hash zu verwenden, das Modell die Daten im Hash-Format haben zu lassen und die ID in einer Datenbank namens "Farben" zu speichern.

Schreiben Sie zunächst Folgendes in die Gemfile.

Gemfile


#~Kürzung~
gem 'active_hash'
gem "chartkick"
gem 'chartable'
#~Kürzung~

Beschreiben Sie Folgendes in application.js.

application.js


//= require Chart.bundle
//= require chartkick

Und hier ist ein Modell mit tatsächlichen Farbdaten unter Verwendung von Active_hash.

color_data.rb


class ColorData < ActiveHash::Base
  self.data = [
    { id: 1, name: 'Weiß', backcolor: "#fff" },
    { id: 2, name: 'schwarz', backcolor: "#000" },
    { id: 3, name: 'grau', backcolor: "#808080" },
    { id: 4, name: 'Braun', backcolor: "#660000" },
    { id: 5, name: 'Beige', backcolor: "#FFE4C4" },
    { id: 6, name: 'Grün', backcolor: "#006400" },
    { id: 7, name: 'Blau', backcolor: "#0000CD" },
    { id: 8, name: 'lila', backcolor: "#8B008B" },
    { id: 9, name: 'Gelb', backcolor: "#FFFF00" },
    { id: 10, name: 'Rosa', backcolor: "#FF82B2" },
    { id: 11, name: 'rot', backcolor: "#FF0000" },
    { id: 12, name: 'Silber', backcolor: "#C0C0C0" },
    { id: 13, name: 'Gold', backcolor: "#DAA520" }
  ]
end

Ich habe es so geschrieben. Der Schlüssel "Hintergrundfarbe" sind die Daten zum Übergeben der angegebenen Farbe an jedes Element des Kreisdiagramms.

Und Modell. Ich wollte die Grafikdaten im Hash-Format und die Hintergrundfarbdaten als Array an den Controller übergeben, was sehr hilfreich ist und ein redundanter Code ist, der dasselbe wiederholt. Ich suche hier einen besseren Weg.

color.rb


class Color < ApplicationRecord
  extend ActiveHash::Associations::ActiveRecordExtensions
  belongs_to_active_hash :color_data
  class << self
    #Methode zum Bilden von Hash-Daten, die an das Diagramm übergeben werden sollen
    def color_data_acquisition_for_graphs
      colors = all
      color_graph_data = {}
      colors.each_with_index do |color, index|
        color_graph_data = { color.color_data.name => 1 } if index.zero?
        #Drehen Sie die von der DB erhaltenen Daten mit jedem und prüfen Sie, ob sie bereits als Schlüssel vorhanden sind
        #Wenn es bereits vorhanden ist, addieren Sie 1 zu dem Wert, der der Standard des Verhältnisses ist.
        if color_graph_data.key?(color.color_data.name)
          color_graph_data[color.color_data.name] += 1
        else
          color_graph_data[color.color_data.name] = 1
        end
      end
      color_graph_data
    end

    def background_color_data_acquisition_for_graphs
      colors = all
      color_graph_data = {}
      background_colors = []
      colors.each_with_index do |color, index|
        if index.zero?
          color_graph_data = { color.color_data.name => 1 }
          #Hintergrundfarbdaten hinzufügen (Hintergrundfarbdaten)
          background_colors << color.color_data.backcolor
        end
        if color_graph_data.key?(color.color_data.name)
          color_graph_data[color.color_data.name] += 1
        else
          color_graph_data[color.color_data.name] = 1
          #Die Reihenfolge wird beibehalten, um Hintergrundfarben hinzuzufügen, wenn ein Schlüssel kommt, der noch nicht importiert wurde
          background_colors << color.color_data.backcolor
        end
      end
      background_colors
    end
  end
end

Bitte beziehen Sie sich hier nicht darauf lol (Jemand, wenn es eine gute Möglichkeit gibt zu schreiben ...)

Übergeben Sie dann die hier erstellten Daten an die Steuerung.

closet_controller.rb


class ClosetController < ApplicationController
  def index
    @color_graph_data = Color.color_data_acquisition_for_graphs
    @background_colors = Color.background_color_data_acquisition_for_graphs
  end
end

Übergeben Sie dann die aggregierten Daten für das Diagramm und die Daten zum Färben des Diagramms an die Ansicht.

Alles was Sie tun müssen, ist es anzuzeigen.

ruby:index.html.slim


= pie_chart @color_graph_data, colors: @background_colors

Allein damit ...

スクリーンショット 2020-10-11 14.34.47.png

Es kann so angezeigt werden.

Übrigens, wenn Sie die Menüelemente nicht benötigen, können Sie sie ausblenden, indem Sie eine Datei mit dem Namen "chartkick.rb" unter config / initializers / und Schreiboptionen erstellen.

chartkick.rb


Chartkick.options = {
  legend: false
}

Auf diese Weise ,,,

スクリーンショット 2020-10-11 14.39.00.png

Zuerst dachte ich, ich müsste die für den Hintergrund angegebene Farbe abhängig von der Farbe bedingt verzweigen, aber zum Zeitpunkt von Active_hash kam mir zunächst die Idee, jeden Hintergrundfarbwert zu haben. Es war gut.

Es wird eine Entwicklung mit 28 Tabellen sein, was die größte Zahl in der Geschichte für persönliche Apps darstellt, also werde ich mein Bestes geben und dabei Spaß haben.

Recommended Posts

[Ruby on Rails] Implementieren Sie ein Kreisdiagramm, das den Prozentsatz der Farben angibt
(Ruby on Rails6) Anzeige der Datenbank, die die ID der Datenbank erhalten hat
Ein Hinweis zum Seed-Feature von Ruby on Rails
[Ruby on Rails] Erstellen Sie mit Chartick ein kreisförmiges Diagramm der Summen nach Spalten
[Ruby on Rails] Bis zur Einführung von RSpec
[Ruby on Rails] Ein Memorandum mit Layoutvorlagen
Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut
[Ruby on Rails] Implementierung einer Validierung, die nur funktioniert, wenn die Bedingungen erfüllt sind
Alle Inhalte der Listenseite löschen [Ruby on Rails]
Erklärung von Ruby on Rails für Anfänger ③ ~ Erstellen einer Datenbank ~
Grundkenntnisse in Ruby on Rails
[Ruby on Rails] Ändere das Speicherziel von Gem Refile * Hinweis
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Erstellen Sie mit der Datei Ruby on Rails seeds.rb eine große Anzahl von Datensätzen mit einem einzigen Befehl
[Ruby on Rails] Einführung der Anfangsdaten
[Ruby on Rails] Japanische Fehlernotation
So lösen Sie die lokale Umgebungskonstruktion von Ruby on Rails (MAC)!
Erklärung von Ruby auf Schienen für Anfänger ①
[Ruby on Rails] Implementierung einer ähnlichen Funktion
Ruby on Rails Wenn Sie die Ursache für das Zurücksetzen beim Speichern nicht kennen.
Eine Reihe von Ablauf der Tabellenerstellung → Datensatzerstellung, Löschung → Tabellenlöschung in Ruby on Rails
[Ruby on Rails] So machen Sie das Linkziel zu einem Teil der angegebenen ID
So beheben Sie Fehler, die beim Integrationstest "Ruby on Rails" auftreten
[Ruby on Rails] Versuchen Sie, einen Service zu erstellen, der einheimische Katzen glücklich macht
[Ruby on Rails] So japanisieren Sie die Fehlermeldung des Formularobjekts (ActiveModel)
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 Rails6) Erstellen von Daten in einer Tabelle
Bestimmen Sie die aktuelle Seite mit Ruby on Rails
[Ruby on Rails] Individuelle Anzeige von Fehlermeldungen
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Rails] Implementieren Sie einen Zähler, der die übergeordnete Kategorie zählt, wenn Sie eine untergeordnete Kategorie registrieren (Abstammung, counter_culture).
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
[Ruby on Rails] Asynchrone Kommunikation der Posting-Funktion, Ajax
[Einführung] Erstellen Sie eine Ruby on Rails-Anwendung
Erstellen Sie eine Ruby on Rails-Entwicklungsumgebung in AWS Cloud9
Implementierung der Ruby on Rails-Anmeldefunktion (Devise Edition)
[Ruby on Rails] So ändern Sie den Spaltennamen
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
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 5 - Kurzanleitung zum Lernen, die im Feld Zusammenfassung verwendet werden kann