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.