tengo una relacion de tablas tipo:
comercial
has_and_belongs_to_many :empresas
empresa
belongs_to :provincia
has_and_belongs_to_many :comercial
y
provincia
has_many :empresas
al realizar el show de un comercial (je je je como suena he)
quiero mostrar el listado de empresas,(esto no es problema)
<% @empresa = @comercial.empresas
<% for empresa in @empresas %>
…
pero tb me gustaria poner una tabla con las provincias de las empresas
de ese comercial y el numero:
algo como
Madrid(3), Barcelona(6), …
para eso hago algo del tipo:
<% for provincia in @comercial.empresas.provincias %>
<%= provincia.nombreprovincia %>
(<%= (provincia.count)%>)
<% end %>
pero me da error en la primera linea:
undefined method `provincias’ for Empresa:Class
q pasa?
hice mal la relacion entre empresas y provincias
Es “provincia” en vez de “provincias”.
@comercial.empresas es un arreglo, por lo cual tanto el metodo
provincias y
provincia no aplica.
Tenes que usar un group by o contar provincias a mano para obtener la
cantidad de empresas por provincia, si eso es lo que queres.
Silvio
El dÃa 27/11/06, lamacarena [email protected]
escribió:
On 11/27/06, lamacarena [email protected] wrote:
y
de ese comercial y el numero:
<% end %>
pero me da error en la primera linea:
undefined method `provincias’ for Empresa:Class
q pasa?
hice mal la relacion entre empresas y provincias
No, pero lo que no parece que tengas muy claro realmente es cuáles son
las
relaciones de tus modelos.
@comercial.provincias es un array de provincias, no una provincia, por
tanto
no tiene el método provincias.
TendrÃas que recorrer las empresas y sacar las provincias de cada una de
ellas.
Tienes que revisar el modo en el que recorres esto, porque me parece que
van
a ser demasiadas consultas a la base de datos.
Un saludo.
–
gracias a los 3
ya entendi el tema de las colecciones.
sera mejor tomar otro camino:
lo de ir empresa por empresa no me gusta,
en asp, lo montaria descargando el peso en la BD
esta consulta seria la adecuada:
SELECT count(*) as cuantos, nombreprovincia
FROM provincias inner join
(empresas inner JOIN empresas_comercials
ON empresas.id = empresas_comercials.empresa_id )
on empresas.provincia_id = provincias.id
WHERE (comercial_id = ‘3021’)
GROUP by nombreprovincia
donde 3021 seria el resultado de un parametro,
descargaria la consulta sobre un recorset y mostraria los campos
nombreprovincia y cuantos.
en asp no tardaria mas de 5 minutos y no creo q en RoR se tarde mas.
como se hace?
On Tue, Nov 28, 2006 at 02:23:42AM +0100, lamacarena wrote:
descargaria la consulta sobre un recorset y mostraria los campos
nombreprovincia y cuantos.
en asp no tardaria mas de 5 minutos y no creo q en RoR se tarde mas.
como se hace?
MÃrate los métodos select_one, select_all, select_value y
select_values.
Para estos casos en los que quieres «números» y no objetos (para
estadÃsticas
y movidas asÃ) no tiene sentido usar objetos de ActiveRecord.
Esos métodos de arriba son de objeto «connection» de los modelos...
¡ah! Y
no te olvides de «escapar» o «proteger» lo que te viene por parámetro,
para
evitar ataques de inyección de SQL…
On Nov 27, 2006, at 4:55 PM, lamacarena wrote:
<% for provincia in @comercial.empresas.provincias %>
<%= provincia.nombreprovincia %>
(<%= (provincia.count)%>)
<% end %>
pero me da error en la primera linea:
undefined method `provincias’ for Empresa:Class
Yep, ocurre que empresas es una coleccion. Cada empresa tiene una
provincia asociada, pero la coleccion de las empresas de un
@comercial como tal no.
Has de ir empresa a empresa:
<% provincias = @comercial.empresas.map {|e| e.provincia} %>
<% for provincia in provincias %>
…
<% end %>
Si pudieran haber provincias repetidas y no quisieras duplicados solo
hay que añadir uniq (no es necesaria ordenacion):
<% provincias = @comercial.empresas.map {|e| e.provincia}.uniq %>
Aunque ese codigo suena a “mucho Ruby” para una vista a priori,
habria que ver si no toca al controlador calcular eso y pasarlo a la
vista mas mascado. Eso ya eres tu quien mejor puede valorarlo segun
los detalles.
– fxn