Rails 2.1 ist da !

Nach 6 Monaten Entwicklungsarbeit und pünktlich zur RailsConf 2008 in Portland wurde Rails 2.1 fertiggestellt. Es wurden über 1600 Änderungen (bzw. Patches) integriert. Eine Installationsanleitung findet Ihr im nächsten Artikel

Folgende neuen Feautures wurde u.a. seit Rails 2.0.2 hinzugefügt:

Neue Methoden first, last und all in ActiveRecord.

Anstatt

  
    Bookmark.find(:first)
    Bookmark.find(:first, :order => "id DESC")
    Bookmark.find(:all)

  

kann man in Rails 2.1 die Kurzschreibweisen verwenden:

  
    Bookmark.first
    Bookmark.last
    Bookmark.all
  

Die längere Form bleibt weiterhin bestehen. Zusätzlich gibt es noch Bookmark.find(:last).

Vereinfachte Suche mit Named scope

Eines der wichtigsten Features für die tägliche Arbeit mit Rails sind die sog. Named Scope. Hiermit kann man Suchabfragen im Model benennen und diese dann einfach abrufen.

Angenommen wir haben ein Model Book mit den Feldern title(string), available(boolean) und rating(integer),

  
    class Book < ActiveRecord::Base
       named_scope :available, :conditions => {:available => true}
       named_scope :best, :conditions => ["rating>=?", 4]
    end
  

Um z.B. alle verfügbaren Bücher zu listen, kann dann einfach Book.available aufrufen, was dem Aufruf Book.find(:all,:conditions=>{:available => true}) entspricht.

Das besondere ist, dass die Named Scope auch verkettet werden können. Um z.B. alle verfügbaren Bücher mit einer Bewertung >= 4 abzufragen, kann wie folgt abgefragt werden:

Book.availaible.best

In einem kommenden Artikel werden wir näher auf das sehr wichtige Thema eingehen.

Updaten von ActiveRecord-Objekten (Partial updates)

Beim updaten von Model-Objekten (ActiveRecord) werden seit Rails 2.1 nur noch die Felder in der Tabelle gespeichert, die sich auch verändert haben. Dies ist insbesondere bei Tabellen mit vielen Attributen von Vorteil, weil es einen Geschwindigkeitsvorteil hat. ActiveRecord stellt auch Methoden zur Verfügung, mit denen man sehr leicht feststellen kann, welche Felder sich verändert haben:

Beispiel: Angenommen wir haben ein Model Bookmark mit den Attributen title und url. In der Rails-Konsole können wir dann folgende Befehle ausführen:

  
    Bookmark.create(:title=>"Rails", :url=>"rubyonrails.com")
    b = Bookmark.last
    b.changed? # => false
    b.title_changed?  # => false
    b.title="Ruby on Rails" 
    b.title_changed? # => true
    b.title_was # => "Rails" 
    b.title_change # => ["Rails", "Ruby on Rails"]

    b.changed? # => true
    b.changed # => ["title"]
    b.changes # => {"title"=>["Rails", "Ruby on Rails"]}
    b.url = "www.rubyonrails.com" 
    b.changes # => {"title"=>["Rails", "Ruby on Rails"], "url"=>["rubyonrails.com","www.rubyonrails.com"]}
  

Zeitstempel statt Nummerierung von Migrations (UTC based Migrations)

Vor Rails 2.1 wurden Migrations aufsteigend nummeriert, wie z.B.

  • db/migrate/001_create_airports.rb
  • db/migrate/002_create_countries.rb

In der Praxis hat sich gezeigt, dass es in Teams zu Konflikten kommt, wenn Entwickler getrennt voneinander Migrations erstellen. Es kann auch beim zusammenführen (merge) von Entwicklungszeigen (Branches) in Versionskontrollsystemen wie SVN und GIT kommen.

Diese Probleme wurden mit Rails 2.1 behoben, indem statt einer aufsteigenden Nummerierung, ein Zeitstempel verwendet wird. Der Zeitstempel entspricht nicht der lokalen Zeit, sondern der Weltzeit (UTC).

Die Dateinamen der Migrations könnten dann wie folgt aussehen:

  • db/migrate/20080601034419_create_airports.rb
  • db/migrate/20080601051358_create_countries.rb

Welche Migrations ausgeführt wurden wird in der Datenbanktabelle schema_migrations gespeichert (Liste aller ausgeführten Migrations). Vor Rails 2.1 wurde in der Datenbanktabelle schema_info nur die Nummer der zuletzt ausgeführten Migration gespeichert. (also nur ein einziger Wert)

Falls Sie ein Projekt mit nummerierten Migrations auf Rails 2.1 updaten, wird durch Ausführung des Befehls rake db:migrate die Datenbank automatisch wie folgt auf den neusten Stand gebracht:

1. Es wird eine Tabelle schema_migrations angelegt 2. Alle Migrations-Nummern von 001 bis zur Nummer die in schema_info steht werden in der Tabelle schema_migrations hinzugefügt. 3. Tabelle schema_info wird entfernt.

Neue Migration Befehle zum Ändern von Tabellen

Mit dem Migration-Befehl change_table können nun mehrere Felder einer Datenbanktabelle gleichzeitig verändert werden.

Im folgenden Beispiel wird eine vorhandene Tabelle Bookmarks mit den Attributen title:string, url:string und comment:text verändert:

script/generate migration ChangeBookmarks

  
class ChangeBookmarks < ActiveRecord::Migration
  def self.up
    change_table(:bookmarks) do |t|
       t.rename :url, :link                    # Feld umbennen von url nach link
       t.remove :comment                       # Feld comment löschen
       t.change :title, :string, :limit => 100 # Auf 100 Zeichen beschränken
       t.text :description                     # Feld description vom Typ Text hinzugfügen
       t.references :category                  # Feld category_id vom Typ Integer hinzufügen
    end
  end

  def self.down
    change_table(:bookmarks) do |t|
       t.rename :link, :url                    # Feld umbennen von link nach url
       t.text :comment                         # Feld comment hinzufügen
       t.change :title, :string, :limit => nil # beschränkung aufheben
       t.remove :description                   # Feld description enfernen
       t.remove_references :category           # Feld category_id entfernen
    end
  end
end
  

Datenbank-Konsole

Durch den Aufruf von script/dbconsole wird die Console der eingestellten Datenbank geöffnet.

Im Falle von Mysql z.B. wird der Befehel mysql -uuser -p passwort datenbank aufgerufen.

Zeitzonen

Normalerweise werden Datumswerte (Date oder DateTime) in der Lokalen Zeit des Servers in der Datenbank gespeichert. Seit Rails 2.1. kann die Zeit in der Datenbank auch in der Weltzeit (UTC) gespeichert werden. Die Konvertierung von der lokalen Zeit in die Weltzeit und umgekehrt führt Rails automatisch aus, wenn in der Konfigurationsdatei environment.rb die lokale Zeitzone eingestellt wird.

  
    Rails::Initializer.run do |config| 
      ...
      config.time_zone = 'Berlin'
    end
  

Die Liste der Möglichen Zeitzonen kann mit rake time:zones:all abgefragt werden.

Mehr zu Zeitzonen folgen in einem weiteren Artikel. Links:

Gem Abhängigkeiten im Rails-Projekt festlegen

Rails kann entweder durch PlugIns oder Gem-Pakete erweitert werden. PlugIns werden im Verzeichnis vendor/plugins abgelegt. Gems werden hingegen in einem Systemverzeichnis ausserhalb von dem Rails-Projekt gespeichert.

Nicht selten kommt es vor, dass Rails-Projekte lokal laufen, jedoch nicht auf dem Server da notwendige Gems fehlen. Das Problem wurde zusätzlich dadurch verstärkt, dass Rails nicht ausgibt, welche Gems-Pakete fehlen.

In Rails 2.1 kann man angeben, welche Gem-Pakete das Projekt benötigt.

Die erforderlichen Gem-Pakete werden in der enviroment.rb eingetragen. Im folgenden Fall sind die Gems-Pakte haml und hpricod ab Verion 0.6 erforderlich:

  
    Rails::Initializer.run do |config|
       ...
       config.gem "haml" 
       config.gem "hpricot", :version => '0.6'       
    end
  

Wenn die Gem-Pakete nicht installiert sind, erscheint beim Server Start folgende Meldung im Log-File (oder script/server):

  
These gems that this application depends on are missing:
 - haml
 - hpricot
Run "rake gems:install" to install them.
  

Mit dem Befehl sudo rake gems:install werden automatisch alle erforderlichen gems im System installiert.

Zusätlich ist es jetzt auch möglich die Gem-Pakete direkt in das Rails-Projekt zu integrieren. Dies hat den Vorteil, dass man z.B. keine Root-Rechte benötigt, um die Gems zu installieren. Mit dem folgenden rake-Taks werden alle erforderlichen Gems im Verzeichnis vendor/gems installiert:

rake gems:unpack

Caching

Seit Rails 2.1 kann angegeben werden, wo die Dateien für das Page-Caching oder Fragment-Caching gespeichert werden. Die Caching-Dateien können nicht nur im Filesystem, sondern auch im memcache gespeichert werden. Dazu mehr in einem weiteren Artikel.

1 Kommentar zum Artikel “Rails 2.1 ist da !”

  1. Frederik antwortet:
    Super! Danke für die Infos. Named Scope hört sich überaus nützlich an.

Sorry, comments are closed for this article.