hmt 8 years ago
parent
commit
f3d95e0bb4
1 changed files with 115 additions and 33 deletions
  1. 115 33
      lib/schild.rb

+ 115 - 33
lib/schild.rb

@@ -1,11 +1,39 @@
 require 'schild/version'
 require 'sequel'
 
-# Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt
+##
+# #Schild Basis-Modul
+# Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt.
+# Die zur Verfügung gestellten Klassen entsprechen dabei den Schild-Tabellen,
+# und den damit verbundenen Assoaziationen.
+#
+# Neben dem Zugriff aus Daten innerhalb einer Tabelle kann über die Schild-Klassen
+# auch auf weitere verknüpfte Tabellen zugegriffen werden. Dazu ein Beispiel:
+#
+# ```ruby
+# Schueler[0].name
+# => "Olsen"
+#
+# Schueler[0].abschnitte[0].jahr
+# => 2017
+# ```
+#
+# Im ersten Beispiel wurde auf den ersten Schüler in der Datenbank ([0]) zugegriffen,
+# und der `name` ausgelesen.
+#
+# Im zweiten Beispiel wird auf den gleichen Schüler zugegriffen und dessen Abschnitt-Tabelle
+# ebenfalls abgefragt. D.h. es wird bereits auf die Abschnitte-Tabelle zugegriffen
+# und automatisch nur Abschnitte zurückgegeben, die zum Schüler gehören. Aus
+# dieser Menge wird ebenfalls der erste Abschnitt gewählt ([0]).
+#
+# Auf diesem Weg können beliebig verschachtelte Anfragen gestartet werden.
+#
+# Es wird empfohlen statt Schild das Modul SchildErweitert einzubinden. Weitere
+# Erläuterungen dazu weiter im Modul.
 module Schild
   Sequel::Model.plugin :tactical_eager_loading
 
-  # @db ist die Datenbank-Verbindung. Alle Daten können über diese Konstante abgerufen werden
+  # @db ist die Datenbank-Verbindung. Alle Daten können über diese Variable abgerufen werden
 
   @db = Sequel.connect("#{ENV['S_ADAPTER']}://#{ENV['S_HOST']}/#{ENV['S_DB']}?user=#{ENV['S_USER']}&password=#{ENV['S_PASSWORD']}&zeroDateTimeBehavior=convertToNull")
   begin
@@ -21,124 +49,161 @@ module Schild
   @db.extension(:freeze_datasets)
   @db.extension(:connection_validator)
 
-  def self.connect
-    @db = Sequel.connect("#{ENV['S_ADAPTER']}://#{ENV['S_HOST']}/#{ENV['S_DB']}?user=#{ENV['S_USER']}&password=#{ENV['S_PASSWORD']}&zeroDateTimeBehavior=convertToNull")
-  end
-
-  def self.db
-    @db
-  end
-
   # Stellt die Schüler-Tabelle samt Assoziationen bereit.
+  # Tabellenname: schueler
   class Schueler < Sequel::Model(:schueler)
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
     many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
+    # @!method abschnitte
+    # @return [Array<Abschnitt>]
     one_to_many :abschnitte, :class => :Abschnitt
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
     one_to_one :bk_abschluss, :class => :BKAbschluss
-    one_to_many :bk_abschluss_leistungen, :class => :BKAbschlussFaecher
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_many :bk_abschluss_leistungen, :class => :BKAbschlussFach
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
     one_to_one :abi_abschluss, :class => :AbiAbschluss
-    one_to_many :abi_abschluss_leistungen, :class => :AbiAbschlussFaecher
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_many :abi_abschluss_leistungen, :class => :AbiAbschlussFach
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
     one_to_one :fhr_abschluss, :class => :FHRAbschluss
-    one_to_many :fhr_abschluss_leistungen, :class => :FHRAbschlussFaecher
-    one_to_many :vermerke, :class => :Vermerke
-    one_to_one :schuelerfoto, :class => :Schuelerfotos
-    one_to_many :sprachenfolge, :class => :Sprachenfolge
-  end
-
-  # Dient als Assoziation für Schüler und deren Klassenbezeichnung etc.
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_many :fhr_abschluss_leistungen, :class => :FHRAbschlussFach
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_many :vermerke, :class => :Vermerk
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_one :schuelerfoto, :class => :Schuelerfoto
+    # @!method fachklasse
+    # @return [Array<Fachklasse>]
+    one_to_many :sprachenfolgen, :class => :Sprachenfolge
+  end
+
+  # Informationen zu Klassenbezeichnung und weiteren Daten über die jeweiligen
+  # Bildungsgänge. Verfügbar als Assoziationen für Schüler.
+  # Tabellenname: eigeneschule_fachklassen
   class Fachklasse < Sequel::Model(:eigeneschule_fachklassen)
     one_to_many :schueler
   end
 
+  # Versetzungstabelle für Fachklassen. D.h. Klassenbezeichnungen für vorhergehende
+  # und nachfolgende Klassen.
+  # Tabellenname: versetzung
   class Versetzung < Sequel::Model(:versetzung)
     many_to_one :fachklasse, :class => :Fachklasse
   end
 
   # Assoziation für Lehrer, hauptsächlich für Klassenlehrer
+  # Tabellenname: k_lehrer
   class Klassenlehrer < Sequel::Model(:k_lehrer)
     one_to_one :abschnitt, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
   end
 
   # Ist die Assoziation, die Halbjahre, sog. Abschnitte zurückgibt.
+  # Tabellenname: schuelerlernabschnittsdaten
   class Abschnitt < Sequel::Model(:schuelerlernabschnittsdaten)
     many_to_one :schueler, :class => :Schueler, :key => :Schueler_ID
-    one_to_many :noten, :class => :Noten
+    one_to_many :noten, :class => :Note
     many_to_one :klassenlehrer, :class => :Klassenlehrer, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
     many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
   end
 
   # Assoziation für Noten
-  class Noten < Sequel::Model(:schuelerleistungsdaten)
+  # Tabellenname: schuelerleistungsdaten
+  class Note < Sequel::Model(:schuelerleistungsdaten)
     many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
     many_to_one :fach, :class => :Faecher, :key => :Fach_ID
   end
 
   # Assoziation für Fächer
+  # Tabellenname: eigeneschule_faecher
   class Faecher < Sequel::Model(:eigeneschule_faecher)
     #siehe abi_...
-    one_to_one :noten
+    one_to_one :note
     one_to_many :abi_abschluss_leistungen
     one_to_one :sprachenfolge, :class => :Sprachenfolge, :key => :Fach_ID
     one_to_many :gliederungen, :class => :Fach_Gliederung, :key => :Fach_ID
   end
 
   # Assoziation für BK-Abschluss des Schülers
+  # Tabellenname: schuelerbkabschluss
   class BKAbschluss < Sequel::Model(:schuelerbkabschluss)
     one_to_one :schueler
   end
 
   # Assoziation für die Prüfungsfächer des Schülers
-  class BKAbschlussFaecher < Sequel::Model(:schuelerbkfaecher)
+  # Tabellenname: schuelerbkfaecher
+  class BKAbschlussFach < Sequel::Model(:schuelerbkfaecher)
     many_to_one :schueler
   end
 
   # Assoziation für Abi-Abschluss des Schülers
+  # Tabellenname: schuelerabitur
   class AbiAbschluss < Sequel::Model(:schuelerabitur)
     one_to_one :schueler
   end
 
   # Assoziation für die Abifächer des Schülers
-  class AbiAbschlussFaecher < Sequel::Model(:schuelerabifaecher)
+  # Tabellenname: schuelerabifaecher
+  class AbiAbschlussFach < Sequel::Model(:schuelerabifaecher)
     many_to_one :schueler
     many_to_one :fach, :class => :Faecher, :key => :Fach_ID
   end
 
   # Assoziation für FHR-Abschluss des Schülers
+  # Tabellenname: schuelerfhr
   class FHRAbschluss < Sequel::Model(:schuelerfhr)
     one_to_one :schueler
   end
 
   # Assoziation für die FHR-fächer des Schülers
-  class FHRAbschlussFaecher < Sequel::Model(:schuelerfhrfaecher)
+  # Tabellenname: schuelerfhrfaecher
+  class FHRAbschlussFach < Sequel::Model(:schuelerfhrfaecher)
     many_to_one :schueler
     many_to_one :fach, :class => :Faecher, :key => :Fach_ID
   end
 
   # Assoziation für die bisher erreichten Sprachniveaus
+  # Tabellenname: schuelersprachenfolge
   class Sprachenfolge < Sequel::Model(:schuelersprachenfolge)
     many_to_one :fach, :class => :Faecher, :key => :Fach_ID
   end
 
-  # Assoziation für die bisher erreichten Sprachniveaus
+  # Besondere Facheinstellungen nach Fachklasse. Betrifft v.a. Sortierung,
+  # Festlegungen über Prüfungsfächer etc.
+  # Tabellenname: fach_gliederungen
   class Fach_Gliederung < Sequel::Model(:fach_gliederungen)
     many_to_one :fach, :class => :Faecher, :key => :Fach_ID
     many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
   end
 
   # Vermerke von Schülern
+  # Tabellenname: schuelervermerke
   class Vermerke < Sequel::Model(:schuelervermerke)
-    many_to_one :Schueler
+    many_to_one :schueler
   end
 
   # Schülerfotos als jpg
-  class Schuelerfotos < Sequel::Model(:schuelerfotos)
+  # Tabellenname: schuelerfotos
+  class Schuelerfoto < Sequel::Model(:schuelerfotos)
     one_to_one :schueler
   end
 
   # Schul-Tabelle
+  # Tabellenname: eigeneschule
   class Schule < Sequel::Model(:eigeneschule)
   end
 
   # Tabelle für Schild-Nutzer
+  # Tabellenname: users
   class Nutzer < Sequel::Model(:users)
   end
 end
@@ -176,8 +241,9 @@ module SchildErweitert
     Symbol.include SchildErweitert::CoreExtensions::Symbol
     String.include CoreExtensions::String
 
-    # bei include wird für jede Spalte in der Schild-Tabelle eine Ersatzmethode
+    # es wird für jede Spalte in der Schild-Tabelle eine Ersatzmethode
     # erstellt, die bei nil ein Null-Objekt erstellt.
+    # Dazu wird die neu angelegte Methode per MethodLogger gesichert.
     def self.included(klass)
       klass.columns.each do |column|
         name = column.snake_case
@@ -196,6 +262,7 @@ module SchildErweitert
       end
     end
 
+    # Es wird ein Null-Objekt erstellt, das einen Standardwert zurückgibt.
     def create_null_object(klass, column)
       k = Schild.db.schema_type_class(klass.db_schema[column][:type])
       if k.class == Array
@@ -219,11 +286,14 @@ module SchildErweitert
     class Methods
       @@accessor_methods = {}
 
+      # Eine Methode dem MethodLogger hinzufügen
+      # @param klasse, methode
       def self.add(klass, meth)
         @@accessor_methods[klass] ||= []
         @@accessor_methods[klass] << meth
       end
 
+      # Liste von Methoden für eine Klasse auslesen
       def self.list(klass)
         @@accessor_methods[klass]
       end
@@ -237,11 +307,13 @@ module SchildErweitert
     # oder auch andersherum: note.index("4-") => 5
     @note = %w[6 5- 5 5+ 4- 4 4+ 3- 3 3+ 2- 2 2+ 1- 1 1+]
 
+    # @param note [Integer]
     def self.punkte_aus_note(note)
       return if note.nil?
       @note.index(note)
     end
 
+    # @param punkte [Integer]
     def self.note_aus_punkten(punkte)
       return unless punkte && punkte.to_i.between?(1,15) || punkte == "0"
       return punkte if ((punkte.to_i == 0) && (punkte.size > 1))
@@ -250,6 +322,7 @@ module SchildErweitert
     end
 
     # Notenbezeichnung als String
+    # @param ziffer [String]
     def note_s(ziffer)
       case ziffer
       when "1", "1+", "1-"
@@ -413,7 +486,7 @@ module SchildErweitert
   end
 
   # Assoziation für Noten
-  class Noten
+  class Note
     include NotenHelfer
 
     # note in String umwandeln
@@ -452,7 +525,7 @@ module SchildErweitert
   end
 
   # Assoziation für die jeweiligen BK-Prüfungsfächer
-  class BKAbschlussFaecher
+  class BKAbschlussFach
     include NotenHelfer
 
     # Wurde das Fach schriftlich geprüft?
@@ -465,6 +538,9 @@ module SchildErweitert
       self.MdlPruefung == "+"
     end
 
+    # holt die jeweilige Note aus der Tabelle.
+    # Standard ist note_abschluss_ba, als Argument kann auch eine andere
+    # verwendet werden (siehe Tabelle)
     def note(notenart=:note_abschluss_ba)
       note_s send(notenart)
     end
@@ -484,36 +560,42 @@ module SchildErweitert
     end
     alias_method :pruefung_bestanden?, :bestanden_abi?
 
+    # Latinum gemacht?
     def latinum?
       self.Latinum == "+"
     end
 
+    # Kleines Latinum erreicht?
     def kl_latinum?
       self.KlLatinum == "+"
     end
 
+    # Gräcum erreicht?
     def graecum?
       self.Graecum == "+"
     end
 
+    # Hebraicum erreicht?
     def hebraicum?
       self.Hebraicum == "+"
     end
   end
 
   # Assoziation für die jeweiligen Abi-Prüfungsfächer
-  class AbiAbschlussFaecher
+  class AbiAbschlussFach
     include NotenHelfer
 
+    # Note aus Tebelle abfragen, Notenart angeben (siehe Tabelle)
     def note(notenart)
       note_s send(notenart)
     end
   end
 
   # Assoziation für die jeweiligen FHR-Prüfungsfächer
-  class FHRAbschlussFaecher
+  class FHRAbschlussFach
     include NotenHelfer
 
+    # Note aus Tebelle abfragen, Notenart angeben (siehe Tabelle)
     def note(notenart)
       note_s send(notenart)
     end