Desarrollo web sobre ruedasRuby on Rails (II)
Banot.net ([email protected])Esteban Manchado Velazquez ([email protected])
19 de marzo de 2010
Indice
1 Presentacion del ejemplo
2 Tareas inicialesCreacion de la aplicacionConfiguracion de la base de datos
3 Un poco de magia
4 Trabajando con modelosORM en ActiveRecordCreacion de modelosMigracionesManipulacion de datos
Indice
1 Presentacion del ejemplo
2 Tareas inicialesCreacion de la aplicacionConfiguracion de la base de datos
3 Un poco de magia
4 Trabajando con modelosORM en ActiveRecordCreacion de modelosMigracionesManipulacion de datos
Bet on Rails
Casa on-line de apuestas deportivas Partidos entre dos equipos con tanteadores enteros Un administrador se encarga de introducir los partidos y
poner los resultados
Los jugadores tendran su espacio my betonrails desde dondepueden manejar todo lo referente a sus apuestas
En las apuestas se usa una moneda ficticia
Indice
1 Presentacion del ejemplo
2 Tareas inicialesCreacion de la aplicacionConfiguracion de la base de datos
3 Un poco de magia
4 Trabajando con modelosORM en ActiveRecordCreacion de modelosMigracionesManipulacion de datos
Generacion del esqueleto
rails --database=sqlite3 betonrails
La orden rails crea el esqueleto de la aplicacion Al especificar la base de datos, obtenemos un fichero de
configuracion adaptado a ella
Configuracion de la base de datosconfig/database.yml
development:adapter: sqlite3database: db/development.sqlite3timeout: 5000
test:adapter: sqlite3database: db/test.sqlite3timeout: 5000
production:adapter: sqlite3database: db/production.sqlite3timeout: 5000
Porque las necesidades cambian
Dependiendo del contexto, las necesidades del desarrolladorcambian
development Caches desactivadas, informes de errores ybreakpoints activados.
production Caches activadas (incluyendo clases) e informesde errores desactivados
test Cache de clases e informes de errores activados.
Pueden definirse nuevos entornos (config/environments)
Indice
1 Presentacion del ejemplo
2 Tareas inicialesCreacion de la aplicacionConfiguracion de la base de datos
3 Un poco de magia
4 Trabajando con modelosORM en ActiveRecordCreacion de modelosMigracionesManipulacion de datos
Andamios para empezar mas rapido
Una de las muchas caractersticas introducidas por Rails Crea un recurso y una interfaz crud Genera el modelo, el controlador, vistas, pruebas. . . Prototipado, algo por donde empezar Especialmente util para aprendizaje
Generando un scaffold
ruby script/generate scaffold game
Se genera un recurso (REST) con interfaz html y xml Modelo Game, descendiente de ActiveRecord::Base Se puede, y debe, especificar los atributos
Indice
1 Presentacion del ejemplo
2 Tareas inicialesCreacion de la aplicacionConfiguracion de la base de datos
3 Un poco de magia
4 Trabajando con modelosORM en ActiveRecordCreacion de modelosMigracionesManipulacion de datos
ActiveRecord
Capa de acceso a bases de datos SQL Implementacion del patron del mismo nombre descrito por
Martin Fowler:
Un objeto que envuelve una fila de una tabla ovista de la base de datos, encapsula el acceso a lainformacion de la base de datos y anade logica deldominio a esa informacion.
En Rails 3: ActiveModel + ActiveRecord
ORM en ActiveRecord
Abstrae los accesos a cada tabla Las clases se corresponden con tablas (Game games), los registros con objetos y los campos con atributos Tambien maneja las relaciones entre objetos
No, Mr. Database, you can not have my business logic.
ORM en ActiveRecord
Cada modelo ActiveRecord esta asociado a una tabla Los modelos no especifican sus atributos directamente, los
infieren automagicamente de la tabla.
Convencion de nombres: tabla games para modelo Game S, puedes usar bases de datos existentes (set table name) Reglas de inferencia disenadas para el ingles (soluciones para
otros idiomas)
ORM en ActiveRecord
Cada modelo ActiveRecord esta asociado a una tabla Los modelos no especifican sus atributos directamente, los
infieren automagicamente de la tabla.
Convencion de nombres: tabla games para modelo Game S, puedes usar bases de datos existentes (set table name) Reglas de inferencia disenadas para el ingles (soluciones para
otros idiomas)
El modelo Game
ruby script/generate model game
Crea la clase Game, hija de ActiveRecord::Base
Trabajar con BBDDs no es comodo
En tiempo de desarrollo, el esquema de base de datos cambiacon frecuencia
Las bases de datos no se guarda en control de versiones Es engorroso actualizar nuestro esquema... y no hablemos de ir hacia una version anterior Cada SGBD tiene su SQL (alguien dijo estandares?)
Migraciones
Permiten manejar los cambios comodamente Anaden un cierto control de versiones
El esquema tiene el concepto de version Numero de version (schema info, Rails 2.0) Timestamps (schema migrations, Rails 2.1 ) config.active record.timestamped migrations
Mediante pequenas transformaciones se avanza/retrocede(reversibles!)
Estan escritas en Ruby (independientes del SGBD) Los modelos estan disponibles durante la migracion El script generate ya creo un fichero de migracion (endb/migrate).
Ejemplo de migracion
class CreateGames < ActiveRecord::Migrationdef self.upcreate_table :games do |t|t.string :homet.string :visitort.integer :home_score, :default => nilt.integer :visitor_score, :default => nilt.datetime :datetime
t.timestampsend
end
def self.downdrop_table :games
end
Tipos de datos (I)
Tipos de datos (y II)
Claves primarias
Por convencion, se usa una clave primaria id entera Se le puede llamar de otro modo... pero debe ser entera No es necesario especificarla en el create table Pero que pasa cuando no hace falta (tablas join)?
create table :doctrinas personajes,:primary key => false do |t|
...create table :libros, :primary key => :codigo do |t|...create table :discos, :primary key => :titulo do |t|...
Columnas e ndices
add column :personajes, :raza, :stringrename column :systems, :bugs, :featureschange column :pedidos, :referencia, :string,
:limit => 15remove column :personajes, :razaadd index :alumnos, :nombreadd index :alumnos, [:nombre, :apellido]add index :pedidos, :referencia,
:name => :indice referenciasremove index :alumnos, :nombre
Ejecutando migracionesLa tarea db:migrate
rake db:migrate
Ejecuta las migraciones pendientes Se puede especificar un numero de version o un timestamp:
rake db:migrate VERSION=3rake db:migrate VERSION=20100117013526
Manejando informacion: recuperacion(Rails 1 y 2)
e1 = Game.find(1)e2 = Game.find by home(Las Palmas)games = Game.find all by visitor(Tenerife)games = Game.find(:all,
:conditions => [ "home = ?", "Las Palmas" ])games = Game.find(:all,
:conditions => { :visitor => Universidad },:order => home score desc)
games = Game.find or create by home and visitor(Barcelona, R. Madrid)
Manejando informacion: creacion
game1 = Game.newgame1.home = "Las Palmas"game1.visitor = "Tenerife"game2 = Game.new(:home => Las Palmas
:visitor => Tenerife)puts game2.homegame2.home score = 1game2.savegame3.create(:home => Barcelona,
:visitor => R. Madrid)
Ejercicio
Escribir una nueva migracion para: Anadir un campo para la fecha/hora lmite de apuesta
(due datetime). Anadir otro campo status (cadena de un solo caracter). Poner un lmite de 128 caracteres a los nombres de los equipos.
Ejecutar la migracion y comprobar que todo ha ido bien. Pista: script/generate
Resumen
1 Crear aplicacionrails --database=sqlite3 betonrails
2 Configurar las base de datosconfig/database.yml
3 Crear el modelo Game. . .ruby script/generate model game. . . o bien el recurso Gameruby script/generate scaffold game
4 Escribir la migracion y ejecutarlarake db:migrate
5 Escribir otra migracion para modificar el modelo Gameruby script/generate migration add_game_status
Presentacin del ejemploTareas inicialesCreacin de la aplicacinConfiguracin de la base de datos
Un poco de magiaTrabajando con modelosORM en ActiveRecordCreacin de modelosMigracionesManipulacin de datos
EjercicioResumen
Top Related