@comercial.empresas.provincias : undefined method

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