Añadir un campo de otra tabla en un mod?

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

No entiendo exactamente lo que querés, pero no es esto?:

@es = Producto.find(id).etapas_productos.map { |ep| ep.etapa.fase }

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

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

Ya estoy perdido :slight_smile:

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

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 }

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.

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)

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.

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…?

Sí, lo haré así. Ya me ha dado ésto bastantes complicaciones, como para
ir
rizando el rizo. Muchas gracias

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.