29
Desarrollo web sobre ruedas Ruby on Rails (II) Banot.net ([email protected]) Esteban Manchado Vel´ azquez ([email protected]) 19 de marzo de 2010

Desarrollo Sobre Ruedas en Rails

Embed Size (px)

DESCRIPTION

desarrollo sobre ruedas en Rails

Citation preview

  • 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