[RUBY] [Entwicklungsprotokoll ⑪] Berechnen Sie die Gesamtzahl der Tage, die vom Datum der Gewährung der Feiertage bis zur Gegenwart verbracht wurden, aus der Anzahl der verbleibenden Tage

Über die Prämisse

Schön dich kennenzulernen, mein Name ist Irifune und ich gehe auf eine Programmierschule. Dieser Artikel wird für meine eigene Ausgabe verwendet, indem ich eine Aufzeichnung über die Entwicklung persönlicher Apps schreibe, die Gegenstand der Schule ist. Wenn jemand es gelesen hat, wäre ich dankbar, wenn Sie mir ein Feedback geben könnten.

Wir werden ein "bezahltes Urlaubsmanagement-Tool" entwickeln. Technische Daten finden Sie unter Frühere Artikel.

Die App wird bereitgestellt, jedoch nicht als Dienst bereitgestellt. Bitte haben Sie Verständnis dafür, dass dies nur ein Teil des Selbststudiums ist. Gehen Sie dann zum Hauptthema.

Inhalt dieser Implementierung

Bis zum vorherigen Zeitpunkt konnten wir das Gewährungsdatum (das Datum, an dem der bezahlte Urlaub 6 Monate nach dem Einstellungsdatum gewährt wird) und die Dienstzeit basierend auf dem Einstellungsdatum des Mitarbeiters berechnen. Lassen Sie mich heute die Gesamtzahl der Verdauungstage berechnen. Beachten Sie insbesondere das folgende Verfahren.

――Wie viele Verdauungstage gibt es insgesamt? ――Wie viele Verdauungstage werden diesmal insgesamt behandelt? --Suchen Sie nach dem zu summierenden Bereich

Wie viele Verdauungstage gibt es insgesamt?

Zunächst einmal gilt der bezahlte Urlaub, den Sie jedes Jahr erhalten, zwei Jahre nach seiner Gewährung. Bei der Verdauung ist es auch wichtig, zuerst die ältesten zu verdauen.

Wenn beispielsweise eine Person, die am 1. April 2018 in das Unternehmen eingetreten ist, drei Urlaubstage in zwei Teilen verdaut, ist der Ablauf wie folgt.

Datum Zunahme / Abnahme der bezahlten Feiertage Verbleibende Tage
2018/4/1 Keine Zunahme oder Abnahme beim Eintritt in das Unternehmen 0 ..
2018/10/1 10 Tage frei Der 10 ..
2019/1/1 3 freie Tage ★ Der 7 ..
2019/10/1 11 Tage frei 18 ..
2020/1/1 3 freie Tage ★ 15. Tag
2020/5/17 Überprüfen Sie die Anzahl der verbleibenden Urlaubstage 15. Tag
2020/10/1 4 Urlaubstage verschwinden ohne Nutzung, 12 Urlaubstage werden gewährt Der 23 ..

Mit anderen Worten, für die Gesamtzahl der Feiertage zum 17. Mai 2020 können Sie die Tabelle nach den folgenden zwei Datensätzen durchsuchen und diese addieren.

Wenn Sie sich jedoch für diese Formel entscheiden, müssen Sie die Feiertage, die am 01. Oktober 2020 unverdaut verschwinden, separat berechnen.

Wie viele Verdauungstage werden diesmal insgesamt behandelt?

Dieses Mal ist die Anzahl der Tage, die Sie endgültig in der Anwendung implementieren möchten, wie folgt.

① Gesamtzahl der in den letzten zwei Jahren gewährten Tage ② Gesamtzahl der Verdauungstage vom letzten Gewährungsdatum bis zur Gegenwart ③ Gesamtzahl der Verdauungstage vom vorherigen Gewährungsdatum bis zum letzten Gewährungsdatum ④ Anzahl der verbleibenden Tage nach Subtraktion von ② und ③ von ①

Ich habe es lange geschrieben, aber ich habe es als mein eigenes Memorandum geschrieben. Daher kann sich die Denkweise in Zukunft ändern. Bitte betrachten Sie es als ein Ereignis in Irifunes Gehirn zum Zeitpunkt des Schreibens des Artikels. Diesmal haben wir also "② Gesamtzahl der Verdauungstage vom letzten Gewährungsdatum bis zur Gegenwart" implementiert, sodass wir dies im Folgenden einführen werden.

Suchen Sie nach dem zu summierenden Bereich

Bis zum letzten Mal wurde die Tabelle nur mit Mitarbeiterdatensätzen erstellt, ab diesem Zeitpunkt werden jedoch auch bezahlte Urlaubsdatensätze in die Berechnung einbezogen. Die Mitarbeiter werden in der Mitarbeitertabelle und der bezahlte Urlaub in der Feiertagstabelle gespeichert. Bearbeiten Sie sie daher über den Controller.

employees_controller.rb


class EmployeesController < ApplicationController
  def index
    @employees = Employee.where(branch_id: params[:branch_id]).includes(:holidays)
  end
~ Ausgelassen ~
end

In der zweiten Hälfte wird die Includes-Methode verwendet, um den Urlaubsdatensatz mit employee_id abzurufen. Die Includes-Methode erschien, als ich das "N + 1-Problem" im Lehrplan lernte. In diesem Fall habe ich gelernt, dass beim Abrufen vieler Datensätze mit einem externen Schlüssel aus einer Eins-zu-Viele-Tabelle der Datensatz mit dem Primärschlüssel verwendet wird, um nach vorne zu schauen. Dieses Mal habe ich den Datensatz des externen Schlüssels mit dem Primärschlüssel verknüpft, sodass die Reihenfolge umgekehrt ist, aber ich konnte ihn sicher verwenden.

Referenzierter Artikel "Abrufen und Anzeigen von Eins-zu-Viele-Tabellendaten mit Rails" @bitarx

Definieren Sie als Nächstes in der Modelldatei eine Methode, um die Suche "vom letzten Gewährungsdatum bis zur Gegenwart" durchzuführen.

models/employee.rb


class Employee < ApplicationRecord
~ Ausgelassen ~
  def range_to_add_or_delete
    grant_day = hire_date >> 6
    month = grant_day.month
    day = grant_day.mday
    year = Date.today.year
    grant_date_this_year = Time.local(year, month, day)

    if grant_date_this_year > Date.today
      last_year = year - 1
      grant_date_this_year = Time.local(last_year, month, day)
    else
      grant_date_this_year
    end

    holidays.where(created_at: grant_date_this_year..Date.tomorrow)
end

Zunächst berechnet grant_day zu Beginn das gesetzliche Grant-Datum (6 Monate nach Eintritt in das Unternehmen). Ich verwende die Methoden ".month" und ".mday", um die Monats- und Tageszahlen zu extrahieren und in Variablen zu speichern. Für das Jahr bereiten wir das heutige Datum mit "Date.today" vor und führen die ".year" -Methode aus, um die Jahreszahl zu extrahieren. Kombinieren Sie abschließend die drei Zahlen mit "Time.local", um das letzte Gewährungsdatum (grant_date_this_year) zu vervollständigen.

Referenzierter Artikel "[Einführung in Ruby] 14. Umgang mit Daten und Zeiten (für alle Muster)" @prgseek

In Bezug auf die IF-Erklärung wird das Jahr gemäß den Bedingungen verarbeitet, um das letzte Datum der letzten Gewährung zu bestimmen. Voraussetzung ist, dass das zuletzt erstellte Gewährungsdatum (grant_date_this_year) größer als das aktuelle Datum ist. Der Grund dafür ist, dass wenn das gesetzliche Gewährungsdatum der Dezember ist, das Ergebnis des letzten gesetzlichen Gewährungstermins der 1. Dezember 2020 ist, was ein zukünftiges Datum ist. Wenn das letzte einmal abgeschlossene Gewährungsdatum größer als das aktuelle Datum ist, wird das letzte Gewährungsdatum mit einer neuen Variablen namens "last_year" neu erstellt, indem -1 aus dem Jahr ausgeführt wird. Im Übrigen kann derzeit nicht festgestellt werden, ob dies erforderlich ist. Es tut mir Leid.

スクリーンショット 2020-05-14 11.38.31.png

In der Zwischenergebnisansicht wird das letzte Gewährungsdatum jedes Mitarbeiters in der Spalte Verdauungstage angezeigt. Master Shouta, der im April in das Unternehmen eingetreten ist, muss keinen zukünftigen Termin haben. War gut ~! !!

Kehren wir zur Codebeschreibung zurück. Suchen Sie nach created_at im Bereich vom letzten im letzten Satz abgeschlossenen Gewährungsdatum bis zur Gegenwart und suchen Sie nach dem erforderlichen Datensatz.

Der Artikel, auf den ich verwiesen habe "So schreiben Sie eine Datums- / Zeitbereichssuche einfach mit ActiveRecord" @ hachi8833

Suchergebnisse zusammenfassen

Da ich innerhalb des angegebenen Bereichs suchen konnte, werde ich die Summe basierend darauf berechnen. Schreiben Sie eine andere Methode, damit die Modelldatei die Gesamtsumme berechnet. Da es sich derzeit in der Entwicklung befindet, haben wir beschlossen, die Gesamtzahl der Gewährungstermine nach derselben Methode zu berechnen. Wie oben erwähnt, gibt es eine andere Methode zur Berechnung des gesamten Gewährungsdatums. Da jedoch andere Methoden für das gesamte Gewährungsdatum implementiert werden müssen, lassen wir diesmal die gleiche Methode für die Bestätigung der Ansicht.

models/employee.rb


class Employee < ApplicationRecord
~ Ausgelassen ~
  def total_delete_day
    total_delete_day = range_to_add_or_delete.sum(:delete_day)
  end
  def total_add_day
    total_add_day = range_to_add_or_delete.sum(:add_day)
  end
  def calculate_remaining_days
    a = total_delete_day
    b = total_add_day
    b - a
  end
end

Das Argument der Methode ".sum" ist der Spaltenname, für den Sie die Summe berechnen möchten. Der Artikel, auf den ich verwiesen habe "Berechnen Sie den Gesamtwert von [Rails] -Spalten!" @tomokichi_ruby

Als nächstes wird berechne_ verbleibende_ Tage definiert, um die Anzahl der verbleibenden Tage zu berechnen. Wenn das Ergebnis der Subtraktion der Summe des Gewährungsdatums und der Summe des Aufschlussdatums ursprünglich negativ ist, sollte es ursprünglich bedingt sein, damit ein Fehler auftritt, aber es dient auch der Bestätigung der Ansicht und wird einfach subtrahiert.

Zeigen Sie das Gesamtergebnis in der Ansicht an

haml:branches/index.html.haml


.main
  =render 'branches/mainheader'
  .main__body
Klicken Sie auf "Name", um die Mitarbeiterdaten zu bearbeiten und ganz rechts zu löschen.
    %table 
      %tr
~Unterlassung~
        %th{id: "short"}
Anzahl der gewährten Tage
        %th{id: "short"}
Verdauungstage
        %th{id: "short"}
Verbleibende Tage
        - @employees.each do |employee|
          %tr
~ Ausgelassen ~
            %th{id: "short"}
              = employee.total_add_day
            %th{id: "short"}
              = employee.total_delete_day
            %th{id: "short"}
              = employee.calculate_remaining_days
~ Ausgelassen ~

Die zuvor definierte Methode spiegelt sich in "index.html.haml" wider. Das Ergebnis der Ansicht ist wie folgt. Ich konnte es sicher berechnen. スクリーンショット 2020-05-14 11.51.20.png

Der heutige Stapel

Ich habe mich daran gewöhnt, Qiita-Artikel zu veröffentlichen. Ich habe das Gefühl, dass es viele Sätze für den Inhalt gibt, aber wenn ich denke, dass ich nachgeforscht oder gestolpert bin und wenn es dem gleichen Anfänger hilft, ist die Erklärung dumm und höflich? Ich versuche zu denken. Es gibt jedoch viele Artikel, die kurz und bündig geschrieben sind und als Referenz für Anfänger dienen können, z. B. die Artikel, auf die ich mich bezog. Daher möchte ich mich der Prägnanz bewusst sein. das ist alles.

Recommended Posts

[Entwicklungsprotokoll ⑪] Berechnen Sie die Gesamtzahl der Tage, die vom Datum der Gewährung der Feiertage bis zur Gegenwart verbracht wurden, aus der Anzahl der verbleibenden Tage
[Java] Ich möchte die Differenz zum Datum berechnen
Programm zum Ermitteln der Anzahl der Tage pro Monat einschließlich des Nebenjahres
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So bestimmen Sie die Anzahl der Parallelen
[Java] Tag ab Datum berechnen (Kalenderklasse nicht verwenden)