Daten natuerlich modellieren und verarbeiten mit Neo4j
Ruby on Rails SS09 08
1. Daniel Dengler
web developer
Ruby on Rails
Workshop SS 2009
„Ruby on Rails“ and the Rails-Logo are registered trademarks of David Heinemeier Hansson – www.rubyonrails.org
7. Bedingungen
nd(Typ, :conditions => Conditions)
Typ kann sein:
• : rst (liefert das erste Element)
• :last (liefert das letzte Element)
• :all (liefert alle Elemente)
Conditions können sein:
• String
• Array
• Hash
8. Bedingungen
Project.find(:first, :conditions => quot;title = 'one'quot;)
# ACHTUNG: Kein vordefinierter Schutz gegen SQL-Injections
# bei der Verwendung von Strings
Project.find(:first, :conditions => [quot;title = ?quot;, quot;onequot;])
Project.find(:first, :conditions => {:title => quot;onequot;})
12. Sortieren
Project.all(:order => quot;titlequot;)
# Alle Projekte aufsteigend nach Titel sortiert
Project.all(:order => quot;title DESCquot;)
# Alle Projekte absteigend nach Titel sortiert
Project.all(:order => quot;title DESC, created_at ASCquot;)
# Alle Projekte absteigend nach Titel und aufsteigend
# nach Erstellungsdatum sortiert, falls doppelt vorhanden
15. N + 1 Problem
Es wird eine Operation auf einer Relation
ausgeführt und damit für jedes Objekt
eine neue Datenbankabfrage generiert.
16. N + 1 Problem
@project = Project.all
@project.each do |p|
puts p.tasks.collect {|t| t.title}
# Lädt beim Aufruf jeweils ein Objekt
end
# Anzahl der Queries:
# 1 Query für das holen aller Projekte
# + jeweils 1 Query für jedes Projekt, dem
# Tasks zugeordnet sind!
17. N + 1 Problem
@project = Project.all(:include => [:task] )
@project.each do |p|
puts p.tasks.collect {|t| t.title}
end
# Anzahl der Queries:
# 1 Query für das holen aller Projekte
# 1 Query für alle Tasks
22. Named Scopes
class Task < ActiveRecord::Base
named_scope :completed, :conditions => ['completed = ?', true]
named_scope :open, :conditions => ['completed = ?', false]
named_scope :high_prio, :conditions => {:priority => quot;highquot;}
end
Task.completed # liefert alle abgeschlossenen Tasks
Task.open # liefert alle offenen Tasks
Task.open.high_prio # liefert alle offenen Tasks mit hoher Priorität
23. Default Scope
class Task < ActiveRecord::Base
default_scope :order => 'completed DESC, title'
end
Task.all # liefert alle Projekte entsprechend sortiert
24. Named Scopes
Vorsicht bei dynamischen
Abfragebedingungen, da diese gecached
werden!
Näheres siehe Dokumentation zu
ActiveRecord::NamedScope::ClassMethods
25. ActiveRecord
Finder
Named Scopes
Validierung
Berechnungen
30. Vorde nierte Validierungen
validates_con rmation_of Feld
• benötigt ein zusätzliches Feld mit der
Bezeichnung Feldname_con rmation
• prüft, ob ein Feld wiederholt korrekt
eingegeben wurde
Beispiel:
Passwortwiederholung
31. Vorde nierte Validierungen
validates_exclusion_of Feld, :in => Array
• der Wert darf nicht im de nierten Array
vorkommt
Beispiel:
Nutzer kann Subdomain bekommen und
darf bestimmte Varianten, wie www, imap
oder smtp nicht wählen
40. Berechnungen
Project.count # liefert Anzahl der Projekte
Project.count(:conditions => {:completed => false})
# liefert Anzahl der Projekte, die abgeschlossen sind
Project.maximum(quot;durationquot;)
Project.minimum(quot;durationquot;)
Project.average(quot;durationquot;)
Project.sum(quot;durationquot;)
# liefern die maximale, minimale, durchschnittliche
# oder gesamte Dauer der Projekte
44. Routing
Aufgaben des Routings:
• Eine HTTP-Anfrage an eine URL in
den Aufruf einer Methode in einem
Controller verwandeln
• URLs aus de nierten Parametern
generieren, damit dies nicht von
Hand erfolgen muss
45. con g/routes.rb
• Enthält die De nition der Routen
• Wird von oben nach unten
abgearbeitet -> erste zutreffende
Route wird verwendet und weitere
Routen werden nicht mehr
betrachtet
57. RESTful Routes
GET /projects - Projektliste liefern
GET /projects/1 - Projekt mit der ID 1 liefern
GET /projects/new - Formular für neues Projekt
58. RESTful Routes
GET /projects - Projektliste liefern
GET /projects/1 - Projekt mit der ID 1 liefern
GET /projects/new - Formular für neues Projekt
POST /projects - Neues Projekt erstellen
59. RESTful Routes
GET /projects - Projektliste liefern
GET /projects/1 - Projekt mit der ID 1 liefern
GET /projects/new - Formular für neues Projekt
POST /projects - Neues Projekt erstellen
GET /projects/1/edit - Formular zum Bearbeiten
60. RESTful Routes
GET /projects - Projektliste liefern
GET /projects/1 - Projekt mit der ID 1 liefern
GET /projects/new - Formular für neues Projekt
POST /projects - Neues Projekt erstellen
GET /projects/1/edit - Formular zum Bearbeiten
PUT /projects/1 - Ändern des Projektes
61. RESTful Routes
GET /projects - Projektliste liefern
GET /projects/1 - Projekt mit der ID 1 liefern
GET /projects/new - Formular für neues Projekt
POST /projects - Neues Projekt erstellen
GET /projects/1/edit - Formular zum Bearbeiten
PUT /projects/1 - Ändern des Projektes
DELETE /projects/1 - Löschen des Projektes
62. RESTful Routes
GET /projects - projects_path
GET /projects/1 - project_path(1)
GET /projects/new - new_project_path
POST /projects - projects_path
GET /projects/1/edit - edit_project_path(1)
PUT /projects/1 - project_path(1)
DELETE /projects/1 - project_path(1)
63. Nested Routes
map.resources :projects do |project|
project.resources :tasks
end
project_tasks_path(1)
URL: /projects/1/tasks
project_task_path(1,1)
URL: /projects/1/tasks/1
64. Formate
respond_to do |format|
format.html # return the default template for HTML
format.xml { render :xml => @project.to_xml }
end