Relaciones entre tablas

Esto seguro que esta fatal, pero como no consigo encontrar
informacion acerca de las diferentes formas de relacionar tablas y
cuando usar cada una, vamos a ver si podeis corregirlo todo para que
las relaciones sean correctas y asi aprendo en “modo practico”.

Modelo libros
-> belongs_to :editoriales
-> belonfs_to :autores
-> has_many :autores
-> has_one :editoriales

Modelo autores
-> has_many :libros

Modelo editoriales
-> has_many :libros

Aparte de “belongs_to”, “has_many” y “has_one”, que mas clausulas
conoceis?

Gracias y perdonad por tan novata pregunta!

En la documentacion del [1] API de Rails estan todas, pero te falta
has_and_belongs_to_many.

[1]
http://rubyonrails.org/api/classes/ActiveRecord/Associations/ClassMethods.html#M000533

2006/9/27, Javier M. [email protected]:

mírate este enlace, que seguramente te aclare un poco las cosas:

saludos

On Wed, 2006-09-27 at 20:16 +0200, Javier M. wrote:

Gracias y perdonad por tan novata pregunta!

/**

has_many :through es otra muy importante…

y esa para que es?

El 27/09/2006, a las 21:27, Damian J.
escribió:

has_many :through es otra muy importante…

El Miércoles, 27 de Septiembre de 2006 20:16, Javier M.
escribió:>

Gracias y perdonad por tan novata pregunta!
Un consejo: yo descubrí hace poco (gracias a esta lista) la posibilidad de
hacer “join” entre tablas añadiendo la opción “through”. Por ejemplo:

La tabla “canciones” tiene campos:
id, titulo, artista_id, album_id

La tabla “artistas”:
id, nombre

La tabla “albums”:
id, nombre

Modelo Cancion:
belongs_to: artista
belongs_to: album

Modelo Artista:
has_many: canciones
has_many : albums, :through => :canciones, :group => :album

Modelo Album:
has_many: canciones
has_many :artistas, :through => :canciones, :group => :artista

Con esto obtenemos un array de “artistas” para cada “album”, pero como

en
todos será el mismo podemos definir el método “artista” que sólo devuelva
uno:
def artista()
if self.artistas.uniq.length == 1
# Si coinciden los artistas de todas las
canciones del
album entonces ese es el artista.
self.artistas[0].name # Devolvemos un
artista.
else
false
end
end

De esta forma, puedes obtener el artista de un album sin más que hacer:
Album.artista
o las canciones de un album:
Album.canciones # un array.
o los albumnes de un artista:
Artista.albums

Gracias!! Pensaba que habia mas y solo hay esas cuatro!!

El 27/09/2006, a las 20:22, Juan P. escribió:

En la documentacion del API de Rails que ponian aqui mismo se hace
referencia ademas de una que nunca he visto:

belongs_to :attachable, :polymorphic => true

y la verdad que el ejemplo que ponen alli esta un poco pequeño, alguien
ha trabajado con ella o conoce la utilidad de esta relacion???

salu2
miguel_e

El Miércoles, 27 de Septiembre de 2006 20:55, Miguel e. Zaldivar hdez
escribió:

En la documentacion del API de Rails que ponian aqui mismo se hace
referencia ademas de una que nunca he visto:

belongs_to :attachable, :polymorphic => true

y la verdad que el ejemplo que ponen alli esta un poco pequeño, alguien
ha trabajado con ella o conoce la utilidad de esta relacion???

Esta relación es realmente útil cuando tratas de definir una relación
con otra
clase “cualquiera” (no determinada en el momento de definir la clase).

Dave T., en el AWDwR2[1], usa un catálogo como ejemplo. Tiene una
clase
CatalogEntry que simboliza una registro de un catálogo, que puede
relacionarse con una imagen (Image), un artículo (Article) o un sonido
(Sound). Cada registro del catálogo tiene una relación belongs_to
:resource
que puede implicar a un objeto de cualquiera de esas tres clases. La
cosa
queda así:

class CatalogEntry < ActiveRecord::Base
belongs_to :resource, :polymorphic => true
end

class Article < ActiveRecord::Base
has_one :catalog_entry, :as => :resource
end

E igual para las clases Sound e Image.

La tabla correspondiente a CatalogEntry tendrá un campo resource_id y
otro
adicional resource_type, para saber de qué clase estamos hablando. Por
supuesto, no puedes tener integridad referencial si usas este esquema.

Las relaciones polimórficas se pueden usar también para paliar uno de
los
posibles efectos de la STI: tener demasiados campos en una tabla. Se
podrían
definir varias clases (cada una con su tabla) y las relaciones que antes
eran
de la clase padre ahora podrían ser polimórficas. No sé si se entiende.

salu2

Saludos.

[1] http://www.pragmaticprogrammer.com/title/rails/