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.
- Blog von Geoff Buesing
- Railscast
- http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones
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 !”
Sorry, comments are closed for this article.
02.06.2008 um 14:51 Super! Danke für die Infos. Named Scope hört sich überaus nützlich an.