Relaciones polimorficas

Alguien puede explicar “para tontos” como funcionan las relaciones
polimorficas y la relacion de los campos de las tables, con las
opciones “as”, “source” y “source_type”?
Por mas que leo la API y algunas explicaciones encontradas en google,
no consigo comprenderlas del todo.
En principio, veo para que sirven, pero no que como configurarlas.

Pofavó.

http://wiki.rubyonrails.org/rails/pages/UnderstandingPolymorphicAssociations

El día 22 de abril de 2008 23:30, Guillermo Álvarez Fernández <
[email protected]> escribió:

El 22/04/2008, a las 20:35, Javier Martínez Fernández
escribió:

Alguien puede explicar “para tontos” como funcionan las relaciones
polimorficas y la relacion de los campos de las tables, con las
opciones “as”, “source” y “source_type”?

Pongamos un ejemplo. Tenemos el modelo Dirección que está compuesto de
calle, barrio, número, teléfono,…
Otro modelo es el usuario.

1 Usuario puede tener muchas direcciones, por lo que en el modelo
dirección hay que poner un user_id que haga referencia al usuario.
Podremos acceder a:

@user.directions y @direction.user

Pero la vida avanza y nuestra aplicación require manejar empresas.
Queremos poder acceder a
@company.directions y @direction.company.

Pero no podemos, por que las direcciones tienen un user_id, no un
company_id. Alguien diría, pues metamos otro campo de company_id…
sería una solución… pero poco práctica. Entonces… otra solución es
meter la parte de id de user_id o company_id por un lado, y por otro
el tipo company o user.

Lo que nos quedaría algo
así:direcctions
addres | country | city | barrio | peligrosidad | loquesea_id |
tipo_de_lo_que_sea

Para hacerlo más cómodo vamos a decir que algo es direccionable (o en
ingles addresable)

addres | country | city | barrio | peligrosidad | adresable_id |
adresable_type

en rails dos puedes poner en la
migracióncreate_table :directions do |d|
d.string :addres, :country

d.references :addresable, :polymofrphic
end

Y los modelos quedaría algo así como:
class User < AR::Base
has_many :addreses, :as => :addressable
end

class Company < AR::Base
has_many :delegations, :as => :addresable
end

class Direcctions < AR::Base
belongs_to :addressable, :polymorphic => true
end

Lo que nos da acceso básicamente a:
@user.addreses.first =>
@company.delegations.first =>
@direction.first.addresable =>
@direction.find(:first,:offset => 2).addresable =>

Y básicamente es eso y no hay mucho más. Si con lo mal que me explico
has conseguido enterarte, me alegro.

Un Saludo.

Emili Parreño, como dije en mi mensaje, ya habia leido varias entradas
(la que pones incluida) acerca de las relaciones polimorficas y no
acababa de entender el uso de los tres valores que comento.
Gracias Guillermo por la explicacion. Lo he entendido muchisimo mejor,
aunque no comentas nada acerca de las relaciones con “through” y las
claves “source” y “source_type”. Sabes como funcionan?