2009-07-31 32 views
5

Mam użytkownik, który posiada wiele telefonów
mam aa komórkowy, który ma wiele zestawień połączeń
dlatego mój użytkownik ma wiele zestawienia połączeńRuby on Rails metoda niezdefiniowany na tablicy

Teraz do kodu, który mam:

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 

Chciałbym wygenerować raport, który pokazuje wszystkie podsumowania połączeń dla telefonów, które należą do tego konkretnego użytkownika. Idę do sterownika, a to jest mój kod tam:

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

Ale ta wraca ten błąd:

undefined method `call_summaries' for #Array:0x476d2d0

Każda pomoc będzie bardzo mile widziane.

Odpowiedz

5

Jeśli masz has_many: poprzez związek skonfigurować, należy po prostu być w stanie to zrobić:

@call_summaries = @current_user.call_summaries 

Problem z metody jest to, że dzwonisz call_summaries na Kolekcja telefonów, a nie pojedyncze wystąpienia telefonu.

+0

Ah ten pracował, dzięki. Jeszcze jedno, ustawiłem klucz obcy w call_summaries, ponieważ nazwy kolumn są różne. I nie szukam również kolumny phones.id. Szukam wygenerowanego klucza szesnastkowego. Jest to SQL, który jest generowany z właściwego polecenia z kluczem obcym. SELECT * FROM call_summaries call_summaries INNER JOIN telefonów na call_summaries.reported_by = phones.id GDZIE phones.user_id = 1 Powinno być phones.hex_key zamiast phones.id. Jak to zmienić, próbowałem kluczy obcych, ale jeśli nie zrobiłem czegoś głupiego, to nie zadziałało. Jeszcze raz dziękuję! – Ryan

+0

Wygląda na to, że musisz użyć opcji: foreign_key i: primary_key na obu końcach powiązania. W CallSummary na przykład spróbuj 'belongs_to: phone,: foreign_key =>: reported_by,: primary_key =>: hex_key' (i zrób to samo dla has_many association w Phone). –

2

@phones to tablica obiektów Phone. Musisz przejrzeć tę tablicę i dodać podsumowania połączeń każdego telefonu do pojedynczej tablicy. Spróbuj tego:

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

Off temacie i tylko ja wybredny, ale dynamiczny wykrywacz jest bardziej czytelny:

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

powinien być '@phones = Phone.find_all_by_user_id (@ current_user.id) – brittohalloran