miércoles, 12 de diciembre de 2007

Active Record

Introducción :

Active Record es la capa que proporciona rails para implementar el patron ORM. La implementación de Active Record se caracteriza, como casi todo en rails, en la convención,

Por ejemplo, si tenemos un modelo 'Ciudad', existe una tabla en base de datos cuyo nombre es la pluralización del nombre del modelo 'ciudades'.


Definición del Patrón ORM :

“Un objeto que reprensenta una fila de una tabla o vista de base de datos, encapsula el acceso a la base y añade lógica del dominio sobre esos datos.”

Para implementar el patrón se deben seguir ciertos pasos:
  1. Las tablas se representan mediante clases
  2. Un objeto representa una fila de la tabla
  3. Un atributo del objeto representa una columna
  4. La clase debe tener métodos para insertar, actualizar y borrar una fila desde un objeto o bien crear un objeto a partir de una fila.


Migraciones:

  1. Las migraciones cambian el estado del esquema de la base de datos.
  2. Con ellas podemos crear o borrar tablas, añadir columnas o eliminarlas, renombrar el tipo de una columna... La consulta sql necesaria para ejecutar la operación la genera ActiveRecord por nosotros.
  3. Esto se consigue construyendo una clase que herede de ActiveRecord::Migration.
  4. Básicamente se necesita implementar 2 métodos de clase: up y down
  5. El méto up se ejecuta cuando estamos migrando 'hacia adelante' y el down cuando migramos 'hacia atrás'

Tipos de migraciones de modificación de tablas y columnas:

  1. Operaciones con tablas: create_table , remove_table , rename_table
  2. Operaciones con columnas: add_column, remove_column , rename_column, etc
  3. Opciones : :null =>true or false , :limit => tamaño , :default => value

Rails asume por defecto que todas las tablas tienen una clave primaria numérica llamada por convención id.


Crear y buscar registros (ejemplo):

def crear_ciudad

ciudad = Ciudad.new

ciudad.nombre = 'Gijón'

ciudad.habitantes = 300000

ciudad.provincia = 'Asturias'

ciudad.save

end

#Se creará el registro en la base de datos, con id = 1

def busca_ciudad_por_id

gijon = Ciudad.find(1)‏

end



Más opciones del find:

:order -> Permite especificar el campo por el que se ordenarán los resultados

:limit -> Indicar el máximo número de registros que devolverá la consulta

:joins -> Para construir la consulta con inner joins

:select -> Especifica los campos que se van a incluir en la consulta. Por defecto *

:from, :group, :having, :distinct, :lock ...


Ejemplo :

def busqueda_con_opciones

ciudades = Ciudad.find :all, :select => 'nombre', :from => 'ciuadades', :limit => 10, :order => 'habitantes desc',

end


Actualizar y guardar registros :

Para actualizar una fila de la bbdd, podemos usar los métodos save, update, update_attribute, o update_attributes.

def ejemplo_save

ciudad = Ciudad.find :first

ciudad.habitantes += 1000

ciudad.save

end


def ejemplo_update_attributes

ciudad = ciudad.find :first

ciudad.update_attributes :nombre => 'otro nombre', :habitantes => 500, :provincia => 'León'

end


Borrar registros:

Para actualizar una fila de la bbdd, se nos ofrecen los métodos delete, destroy. Se les pueden pasar condiones si terminan en _all

def ejemplo_destroy

ciudad = Ciudad.find :first

ciudad.destroy

end


def ejemplo_destroy_all

ciudad.find :first

limite_habitantes = 100

ciudad.destroy_all([habitantes < ?,limite_habitantes])‏

end


Curiosidades:
  • Diferencia entre find y find_by_id:

La diferencia básica es que el find lanza una excepción (que deberíamos capturar) si no encuentra el registro, mientras que find_by_id (o cualquier buscador dinámico) devuelve nil o [] si no encuentra nada.

  • Diferencias entre Save, save!, create,create!, update_attributes y update_attributes! :

Las que no terminan con ! devuelven true o false, segun se haya guardado correctamente en base de datos o no. Es tarea del programador ocuparse (o no) de lo que pasa con la base de datos.
Las que terminan en ! lanzan una excepción si no se guarda correctamente en la base de datos. Esto es ideal para las traasacciones.

No hay comentarios: