Thursday 26 April 2007

Active Records (II)

Siguiendo con el manualillo que voy escribiendo sobre como entender el concepto de ActiveRecord, voy a poner una ayuda para entender mejor como se realizan relaciones. Las relaciones se establecen usando palabras clave y un punto de relación. El problema es con los puntos de relación. Según el tipo de relación tenemos que definirlo como plural o como singular. Alguien me djo una vez que lo que mas le gustaba de Ruby era el lenguaje en si, ya que se parece mucho al lenguaje natural. Estas son las formas de relacion posible.

  • Relaciones singulares
    • has_one :other
    • belongs_to :other
  • Relaciones plurales
    • has_many :others
    • has_and_belongs_to :others
Mejor todavía, vamos a verlas desde el punto de vista de un modelo entidad relacion.

  • One-to-One
    • has_one :other (TABLA REFERENCIADA)
    • belongs_to :other (TABLA CON LA FOREIGN KEY)
  • One-to-Many
    • has_many :others (TABLA REFERENCIADA)
    • belongs_to :other (TABLA CON LA FOREIGN KEY)
  • Many-to-Many (Join table)
    • has_and_belongs_to :others (AMBAS TABLAS REFERENCIADAS)
Siguiendo la guia que di en el anterior articulo podemos entender mejor las referencias que hacen las palabras reservadas. Solo queda un detalle más a esclarecer. el uso de singulares y plurales.

Nuestras tablas estan en plural, nuestras clases Model estan en singular (customers, Customer) y aqui, ¿Como la ponemos? pues depende. Nos tenemos que olvidar de la convención de nombrado de la BBDD y el Modelo y pensar como lo hariamos si tuvieramos que describirlo.

Ej.

En una relacion 1 a N entre unas tablas Writers - Novels la relación sería

class Writer
has_many :novels
end

class Novel
belongs_to :writer
end

Es un poco extraño ya que no tenemos una identificación directa para novels en las clases Model pero, ¿No os parece intuitivo? Este ejemplo es demasiado obvio, en otras ocasiones los elementos que almacenamos en las BBDD no son tan sencillos de identificar por sus referencias, pero creo que es suficientemente explicativo.

No comments: