2009-07-31 11 views
5

Ho un utente che possiede molti telefoni
Ho aa telefono che ha molti riassunti di chiamata
quindi il mio utente ha molti riassunti di chiamataRuby on Rails metodo non definito per la serie

Ora per il codice che ho:

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 

Vorrei generare un rapporto che mostri tutti i riepiloghi delle chiamate per i telefoni che appartengono a quel determinato utente. Vado nel controller e questo è il mio codice non:

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

ma questo è tornando questo errore:

undefined method `call_summaries' for #Array:0x476d2d0

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

Se avete la has_many: attraverso la relazione istituita, si dovrebbe solo essere in grado di fare:

@call_summaries = @current_user.call_summaries 

Il problema con il vostro metodo è che si sta chiamando sul call_summaries collezione @phones, piuttosto che su singole istanze di telefono.

+0

Ah questo ha funzionato, grazie. Ancora una cosa, ho impostato una chiave esterna in call_summaries perché i nomi delle colonne sono diversi. E non sto neanche cercando la colonna phones.id. Sto cercando una chiave esadecimale generata. Questa è la SQL che viene generato dal comando corretto con una chiave esterna:. call_summaries SELECT * FROM call_summaries INNER JOIN telefoni ON call_summaries.reported_by = phones.id DOVE phones.user_id = 1 Dovrebbe essere phones.hex_key invece di phones.id. Come posso cambiarlo, ho provato le chiavi esterne ma a meno che non abbia fatto qualcosa di stupido, non ha funzionato. Grazie ancora! – Ryan

+0

Sembra che dovrai usare le opzioni: foreign_key e: primary_key su entrambe le estremità dell'associazione. In CallSummary, ad esempio, prova 'appartiene_to: telefono,: foreign_key =>: reported_by,: primary_key =>: hex_key' (e fa la stessa cosa per has_many in Phone). –

2

@phones è un array di oggetti Phone. È necessario ripetere questa matrice e aggiungere i riepiloghi delle chiamate di ogni telefono a un singolo array. Prova questo:

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

Off topic e solo a me essere pignoli, ma un cercatore dinamica è più leggibile:

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

dovrebbe essere '@phones = Phone.find_all_by_user_id (@ current_user.id)' – brittohalloran

Problemi correlati