vilec
September 26, 2006, 3:14pm
1
ReenvÃo el mensaje porque no sé si con esto del foro se habrá leÃdo:
Hola, tengo una dudilla. A saber:
Tengo una relación n a n entre producto y etapas y tengo asà los
modelos:
class Producto < ActiveRecord::Base
has_many :etapas_productos
has_many :etapas, :through => :etapas_productos, :order => :fase
end
class EtapasProducto < ActiveRecord::Base
belongs_to :producto
belongs_to :etapa
end
class Etapa < ActiveRecord::Base
has_many :etapas_productos
has_many :productos, :through => :etapas_productos
end
En la tabla etapas_productos tiene 3 campos: etapa_id, producto_id y
lead_time, que es un número.
En la tabla etapas hay además de su id un campo que es fase
Lo que me gustarÃa es poder acceder al campo fase de cada etapa al hacer
ésto:
@es = Producto.find(id).etapas_productos
¿HabrÃa alguna manera de que se introdujese automáticamente en el array
@es
con alguna sentencia en el modelo? (algo asà como belongs_to :etapa,
:campo
=> :fase)
A todo esto, creo que los has_many :etapas_productos sobran. ¿Tengo
razón?
Gracias
vilec
September 26, 2006, 8:43pm
2
No entiendo exactamente lo que querés, pero no es esto?:
@es = Producto.find(id).etapas_productos.map { |ep| ep.etapa.fase }
vilec
September 27, 2006, 11:18am
3
Bueno, con eso recuperarÃa las fases asociadas a cada etapa.
Lo que yo quiero realmente es que al recuperar las etapas asociadas al
producto, también se recupere la fase de cada etapa o al menos poder
ordenar
cada etapa por su fase. Actualmente lo hago asÃ, pero no me parece muy
elegante.
query = "select fase, etapa_id,lead_time "
query << "from etapas e, etapas_productos ep "
query << "where e.id=etapa_id and ep.producto_id =? "
query << “order by fase”
@etapas_productos = EtapasProducto.find_by_sql
[query,@lote.producto_id ]
Muchas gracias por tu ayuda
vilec
September 27, 2006, 3:30pm
4
Me parece que me estoy explicando mal…
SÃ que funciona si pongo @productos.etapas . Recupera correctamente las
estapas asociadas a ese producto y ordenadas por fase, pero yo lo que
quiero
es recuperar también información de la tabla que sirve de union.
En concreto el campo lead_time que está en la tabla ETAPAS_PRODUCTOS y
no en
la tabla ETAPAS
Gracias
vilec
September 27, 2006, 4:19pm
5
Ya estoy perdido
A ver
class Producto < ActiveRecord::Base
has_many :etapas_productos, :include => :etapas, :order =>
‘etapas.fase’
has_many :etapas, :through => :etapas_productos, :order => :fase
end
Si eso funciona (?), entonces sólo quedaría pedir
@producto.etapas_productos
vilec
September 27, 2006, 3:20pm
6
Veo que la opción :order está puesta… no anda?
Quizás probá esto:
:order => ‘fase’
Es decir, un string en vez de un symbol.
Si no,
@productos.etapas.sort_by { |e| e.fase }
vilec
September 27, 2006, 4:45pm
7
Vaya lÃo nos estamos montando. Veamos…
El problema es que si pido @producto.etapas_productos , me devuelve la
lista
con los datos que yo quiero pero sin ordenar por fase:
#<EtapasProducto:0x39432cc @attributes={“etapa_id”=>“1”,
“producto_id”=>“66”, “lead_time”=>“2”}>,
#<EtapasProducto:0x3943290 @attributes={“etapa_id”=>“2”,
“producto_id”=>“66”, “lead_time”=>“3”}>,
#<EtapasProducto:0x3943254 @attributes={“etapa_id”=>“9”,
“producto_id”=>“66”, “lead_time”=>“4”}>,
#<EtapasProducto:0x3943218 @attributes={“etapa_id”=>“11”,
“producto_id”=>“66”, “lead_time”=>“1”}>,
#<EtapasProducto:0x39431dc @attributes={“etapa_id”=>“59”,
“producto_id”=>“66”, “lead_time”=>“2”}>
Y si pido pido @producto.etapas , me devuelve las etapas ordenadas, pero
sin
el dato que yo quiero, que es el lead_time:
#<Etapa:0x3922edc @attributes={“titulo”=>“pruebaa a”,
“departamento_id”=>“4”, “id”=>“59”, “fase”=>“103”}>,
#<Etapa:0x3922e50 @attributes={“titulo”=>“Emisi\363n de la Orden de
Producci\363n”, “departamento_id”=>“1”, “id”=>“1”, “fase”=>“110”}>,
#<Etapa:0x3922e14 @attributes={“titulo”=>“Emisi\363n del Pedido de
Compra”, “departamento_id”=>“1”, “id”=>“2”, “fase”=>“120”}>,
#<Etapa:0x3922d9c @attributes={“titulo”=>“Recepci\363n orden
producci\363n por Almac\351n”, “departamento_id”=>“7”, “id”=>“9”,
“fase”=>“240”}>,
#<Etapa:0x3922ce8 @attributes={“titulo”=>“Preparaci\363n Orden
Componentes”, “departamento_id”=>“7”, “id”=>“11”, “fase”=>“315”}>
Como puedes ver, con la primera sentencia, vienen ordenadas por id y en
la
segunda por fase.
Y con mis conocimientos rubyescos, no sé es cómo añadir al array
“etapas” un
campo nuevo que sea “fases”.
Seguro que es muy sencillo, pero no lo consigo.
vilec
September 27, 2006, 4:51pm
8
class Producto < ActiveRecord::Base
has_many :etapas, :through => :etapas_productos, :order => :fase
has_many :etapas_productos, :include => :etapas, :order =>
‘etapas.fase’
end
(las di vuelta)
vilec
September 27, 2006, 4:45pm
9
No leà correctamente lo que me pusiste en el mensaje y ya habÃa escrito
otro. Con tu solución ahora me dice
Association named ‘etapas’ was not found; perhaps you misspelled it?
Ya me ha dejado completamente perdido…
---------- Forwarded message ----------
From: Luis V. [email protected]
Date: Sep 27, 2006 4:43 PM
Subject: Re: [Ror-es] Añadir un campo de otra tabla en un modelo?
To: “La lista sobre Ruby On Rails (rubyonrails.com ) en castellano” <
[email protected] >
Vaya lÃo nos estamos montando. Veamos…
El problema es que si pido @producto.etapas_productos , me devuelve la
lista
con los datos que yo quiero pero sin ordenar por fase:
#<EtapasProducto:0x39432cc @attributes={“etapa_id”=>“1”,
“producto_id”=>“66”, “lead_time”=>“2”}>,
#<EtapasProducto:0x3943290 @attributes={“etapa_id”=>“2”,
“producto_id”=>“66”, “lead_time”=>“3”}>,
#<EtapasProducto:0x3943254 @attributes={“etapa_id”=>“9”,
“producto_id”=>“66”, “lead_time”=>“4”}>,
#<EtapasProducto:0x3943218 @attributes={“etapa_id”=>“11”,
“producto_id”=>“66”, “lead_time”=>“1”}>,
#<EtapasProducto:0x39431dc @attributes={“etapa_id”=>“59”,
“producto_id”=>“66”, “lead_time”=>“2”}>
Y si pido pido @producto.etapas , me devuelve las etapas ordenadas, pero
sin
el dato que yo quiero, que es el lead_time:
#<Etapa:0x3922edc @attributes={“titulo”=>“pruebaa a”,
“departamento_id”=>“4”, “id”=>“59”, “fase”=>“103”}>,
#<Etapa:0x3922e50 @attributes={“titulo”=>“Emisi\363n de la Orden de
Producci\363n”, “departamento_id”=>“1”, “id”=>“1”, “fase”=>“110”}>,
#<Etapa:0x3922e14 @attributes={“titulo”=>“Emisi\363n del Pedido de
Compra”, “departamento_id”=>“1”, “id”=>“2”, “fase”=>“120”}>,
#<Etapa:0x3922d9c @attributes={“titulo”=>“Recepci\363n orden
producci\363n por Almac\351n”, “departamento_id”=>“7”, “id”=>“9”,
“fase”=>“240”}>,
#<Etapa:0x3922ce8 @attributes={“titulo”=>“Preparaci\363n Orden
Componentes”, “departamento_id”=>“7”, “id”=>“11”, “fase”=>“315”}>
Como puedes ver, con la primera sentencia, vienen ordenadas por id y en
la
segunda por fase.
Y con mis conocimientos rubyescos, no sé es cómo añadir al array
“etapas” un
campo nuevo que sea “fases”.
Seguro que es muy sencillo, pero no lo consigo.
vilec
September 27, 2006, 4:57pm
10
Mmm… creo que con un join model de todas maneras la PK es id como en
todas las tablas… así debería quedar…
Rails no soporta, hasta donde yo sé, claves compuestas…
Podrías dejar el id como numérico (idem todas las otras tablas) y
crear un índice unique en esos dos campos de join…?
vilec
September 27, 2006, 4:59pm
11
SÃ, lo haré asÃ. Ya me ha dado ésto bastantes complicaciones, como para
ir
rizando el rizo. Muchas gracias
vilec
September 27, 2006, 4:51pm
12
Vaaaaale, puse :etapa en vez de :etapas en la solución que me diste:
class Producto < ActiveRecord::Base
has_many :etapas_productos, :include => :etapas, :order =>
‘etapas.fase’
has_many :etapas, :through => :etapas_productos, :order => :fase
end
pero ahora me dice que no encuentra etapas_productos.id, lo que es
normal ya
que mi tabla sólo tiene: etapa_id , producto_id y lead_time, por lo que
su
primary key es etapa_id y producto_id.
¿Alguna pista de cómo se dice al modelo que la primary key son 2 campos
en
vez del tÃpico id?
Oye y muchÃsimas gracias por tu ayuda, eres todo un crack.