Neues in Rails 2.2 Teil 2: ActiveRecord
Im zweiten Teil unser Serie zu Neues in Ruby Rails 2.2 schauen wir uns die wichtigsten Neuerungen in ActiveRecord an. Die neue Version erleichtert u.a. die Suchekriterien.
Beispiel
Die neue Funktionalität werden wir anhand eines Beispiels erläutern.
Im folgenden Fall definieren wir eine Klasse Bookmarks und eine Klasse Category. Jedes Bookmark ist genau einer Category zugeordnet und zu jeder Category gibt es belieig viele Bookmarks (1-zu-viele Beziehung).
create_table "bookmarks", :force => true do |t| t.string "title" t.string "url" t.integer "category_id" t.datetime "created_at" t.datetime "updated_at" end create_table "categories", :force => true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" t.boolean "active" end
class Bookmark < ActiveRecord::Base belongs_to :category end
class Category < ActiveRecord::Base has_many :bookmarks end
Ausserdemen erstellen wird folgende Beispiele:
# Kategorien Ruby und PHP erstellen ruby = Category.create(:name=>"Ruby", :active=>true) rails = Category.create(:name=>"Rails", :active=>true) php = Category.create(:name=>"PHP", :active=>false) # Bookmarks erstellen Bookmark.create(:title=>"Ruby Homepage", :url=>"http://www.ruby-lang.org/", :category=>ruby) Bookmark.create(:title=>"Rails Homepage", :url=>"http://rubyonrails.org/", :category=>rails) Bookmark.create(:title=>"PHP Homepage", :url=>"http://php.net/", :category=>php)
Suchkriterien vereinfachen mit merge_conditions
Um alle Bookmarks mit dem Titel “Ruby Homepage” zu listen können wir folgenden Befehl ausführen:
Bookmark.find(:all, :conditions=>["title=?","Ruby Homepage"])
Schöner ist jedoch die Hash-Schreibweise:
Bookmark.find(:all, :conditions=>{:title => “Ruby Homepage”})
Wenn wir alle Bookmarks abfragen möchten, die nicht älter als 1 Monat sind können wir die Hash-Syntax nicht verwenden:
Bookmark.find(:all, :conditions=>["created_at > ?", 1.month.ago])
Um jedoch beide Abfragen gleichzeitig durchzuführen, können wir in Rails 2.2 nun wie folgt vorgehen:
Bookmark.find(:all, :conditions=>“title=? AND created_at > ?”, “Ruby Homepage”, 1.month.ago])
In Rails 2.3 können wir die Abfrage vereinfachen (nicht kürzer, aber schönerer Code).
cond1 = {:title => "Ruby Homepage"}
cond2 = ["created_at > ?", 1.month.ago]
Bookmark.merge_conditions(cond1,cond2)
User.find(:all, :conditions)
Die Methode merge_conditions generiert SQL:
Bookmark.merge_conditions(cond1,cond2)
=> (“bookmarks”.“title” = ‘Ruby Homepage’) AND (created_at > ‘2009-01-12 23:10:48’)
Suchkriterien bei Assoziationen
In Rails 2.3 können Suchkriterien bei Assoziationen noch einfacher definiert werden.
Um alle Bookmarks abzufragen, die zu aktiven Kategorien gehören, kann man die folgende Abfrage stellen:
Bookmark.find(:all, :join=> :categories, :conditions=>["categories.active=?", true])
In Rails 2.3 hat man eine schönere Syntax, die mehr Ruby typisch ist:
Bookmark.find(:all, :joins => :category, :conditions=>{ :categories=>{:active=>true}})
Bei beiden Methoden wird nur eine einzige SQL-Abrage ausgeführt.
Um z.B. alle Bookmarks mit dem Titel “Ruby Homepage” zu listen, die zu aktiven Kategorien gehören kann folgende Abfrage durchgeführt werden:
Bookmark.find(:all, :joins => :category, :conditions=>{ :title=>"Ruby Homepage", :categories=>{:active=>true}})
Erweiterte Validierung mit length
Um die Länge eines Feldes zu validieren stellt Rails die Validierungs-Methode validate_length_of zur Verfügung.
Im folgenden Beispiel muss der Titel mindestens 20 Zeichen enthalten.
class Bookmark < ActiveRecord::Base
belongs_to :category
validates_length_of :title,
:minimum => 20,
:too_short => "mind. 20 Zeichen"
end
Was ist jedoch, wenn man z.B. mindestens 5 Wörter haben möchte ? Mit dem neuen tokenizer Attribut kann man einen Regulären Ausdruck angeben, der angbit, was gezählt werden soll
class Bookmark < ActiveRecord::Base
belongs_to :category
validates_length_of :title,
:minimum => 5,
:tokenizer => lambda {|str| str.scan(/\w+/)},
:too_short => "mind. 5 Wörter"
end
Die Methode lambda stellt einen Code-Block dar und der Reguläre Ausdruck \w+ passt auf ein oder mehrere Buchstaben oder Zahlen ohne Leerzeichen (also ein Wort).
Vereinfachte Verbindungen zur Datenbank mit Connection-Pooling
…
Sorry, comments are closed for this article.