2009-07-31 6 views
5

Tengo un usuario que posee muchos teléfonos
tengo aa teléfono que tiene muchos resúmenes de llamadas
por lo tanto mi usuario tiene muchos resúmenes de llamadasrubí en los carriles método no definido para la matriz

Ahora que el código que tengo:

class User < ActiveRecord::Base 
    has_many :phones 
    has_many :call_summaries, :through => :phones 
end 

class Phone < ActiveRecord::Base 
    belongs_to :user 
    has_many :call_summaries 
end 

class CallSummary < ActiveRecord::Base 
    belongs_to :phones 
end 

Me gustaría generar un informe que muestre todos los resúmenes de llamadas para los teléfonos que pertenecen a ese determinado usuario. Entro en el controlador y este es mi código de allí:

def index 
    @phones = Phone.find(:all, :conditions => ["user_id = ?", @current_user.id]) 
    @call_summaries = @phones.call_summaries.find(:all) 
end 

Pero esto vuelve este error:

undefined method `call_summaries' for #Array:0x476d2d0

sería muy apreciado Cualquier ayuda.

Respuesta

5

Si usted tiene la has_many: a través de la relación creada, sólo debe ser capaz de hacer:

@call_summaries = @current_user.call_summaries 

El problema con el método es que usted está llamando en la call_summaries la colección de @phones, en lugar de hacerlo en instancias telefónicas individuales.

+0

Ah esto funcionó, gracias. Solo una cosa más, configuré una clave foránea en call_summaries porque los nombres de las columnas son diferentes. Y tampoco estoy buscando la columna phones.id. Estoy buscando una llave hexagonal generada. Este es el SQL que se genera desde el comando correcto con una clave externa:. call_summaries SELECT * FROM call_summaries INNER JOIN celulares en call_summaries.reported_by = phones.id DONDE phones.user_id = 1 Debe ser phones.hex_key en lugar de phones.id. Cómo cambio eso, probé las llaves foráneas, pero a menos que hiciera algo tonto, eso no funcionó. ¡Gracias de nuevo! – Ryan

+0

Parece que necesitará usar las opciones: foreign_key y: primary_key en ambos extremos de la asociación. En CallSummary, por ejemplo, intente 'belongs_to: phone,: foreign_key =>: reported_by,: primary_key =>: hex_key' (y haga lo mismo para la asociación has_many en Phone). –

2

@phones es una matriz de Phone objetos. Debe iterar a través de esa matriz y agregar los resúmenes de llamadas de cada teléfono a una única matriz. Prueba esto:

@phones = Phone.find(:all, :conditions => ["user_id = ?", @current_user.id]) 
@call_summaries = @phones.inject([]){|arr, phone| arr + phone.call_summaries} 
1

Fuera de tema y me acaba de ser exigente, pero un buscador dinámico es más legible:

@phones = Phone.find_all_by_user_id(@current_user) 
+0

debe ser '@phones = Phone.find_all_by_user_id (@ current_user.id)' – brittohalloran

Cuestiones relacionadas