Ruby on Rails: Ausgewählte Themen

Aus Wikibooks

Wechseln zu: Navigation, Suche

[Bearbeiten] Zyklische und alternierende Zeilenformatierung

[Bearbeiten] Problem

Die Zeilen einer Tabelle sollen abwechselnde Hintergrundfarben erhalten.

[Bearbeiten] Lösung

Das Modul ActionView::Helpers::TextHelper bietet mit der cycle-Funktion einen Generator für zyklische Werte an.

[Bearbeiten] Beispiel

Eine Tabelle erhält abwechselnd rote, grüne und blaue Zeilen.

<table>
        <% for row in ['Zeile 1', 'Zeile zwei', 'Dritte Zeile', 'Vorletzte Zeile', 'Letzte Zeile' ]%>
        <tr style="background-color: <%= cycle 'red', 'green', 'blue' %>;">
                <td><%= row %></td>
        </tr>
        <% end %>
</table>

So sieht es aus:

Zeile 1
Zeile zwei
Dritte Zeile
Vorletzte Zeile
Letzte Zeile

[Bearbeiten] Hinweise

  • Im allgemeinen sollten Stilvorlagen verwendet werden.
  • Der erste Parameter ist der Startwert.
  • Bei verschachtelten cycle-Anweisungen sollten diesen ein Name gegeben werden (:name => 'xyz') und der Generator sollte manuell mit reset_cycle zurückgesetzt werden.

[Bearbeiten] Migration und benannte Sql-Schemata

[Bearbeiten] Problem

Das Migration-System von Rails unterstützt keine benannten Sql-Schemata, wie sie beispielsweise von Postgresql unterstützt werden.

[Bearbeiten] Lösung

Die Kommandos create_schema und drop_schema sollen in das Migration-System für Postgresql-Datenbanken integriert werden. Mit den Kommandos sollen benannte Schemata erstellt oder entfernt werden. Die Option force, soll trotz Widersprüchen die Aktion ausführen.

Dazu muss der PostgreSQLAdapter erweitert werden. In einer neu anzulegenden Datei lib/migration_ext.rb werden die neuen Kommandos definiert:

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  #
  # Benanntes Schema erstellen.
  #
  def create_schema schema_name, options={}
    # Bei der force-Option wird ein möglicherweise vorhandenes Schema gelöscht
    drop_schema schema_name, :force => true if options[:force] rescue nil
 
    execute "CREATE SCHEMA #{schema_name}"
  end
 
  #
  # Benanntes Sql-Schema entfernt.
  #
  def drop_schema(schema_name, options={})
    sql = ''
    sql << "DROP SCHEMA #{schema_name}"
    # Die force-Option entfernt das Schema, auch wenn Abhängigkeiten bestehen.
    sql << ' CASCADE' if options[:force]
    execute sql
  end
end

In der Datei config/environment.rb wird die Zeile

require 'migration_ext'

am Dateiende ergänzt, so dass Rails die Erweiterung einbindet.

[Bearbeiten] Beispiel

Innerhalb einer Migration kann ein Schema erstellt oder entfernt werden. Die Tabellenkommandos können anschließend auf das Schema zugreifen:

class Sport < ActiveRecord::Migration
  def self.up
    create_schema 'sport'
 
    create_table 'sport.activities' do |t|
      t.column 'description', :string
      t.column 'day', :date
    end
  end
 
  def self.down
    drop_table 'sport.activities'
    drop_schema 'sport', :force => true
  end
end

[Bearbeiten] Hinweise

  • Es fehlt die Verallgemeinerung für andere Datenbanken.
  • Eleganter ist eine Realisierung als Plugin.
Persönliche Werkzeuge