2011-01-10 11 views

Odpowiedz

8

Spróbuj Shirt.red
self.red byłaby metoda obiektu. scope :red jest już metodą klasy, więc nie trzeba pisać metody find_red, aby wykonać zapytanie, już to zrobi Shirt.red.

1

Wywołujesz metodę instancji wykonując return self.red.

Co chcesz osiągnąć jest

def find_red 
    return Shirt.red 
end 
1

może się okazać korzystne nazywając self.class.red do Shirt.red proponowanych w innych odpowiedzi. Nie jest tak przyjemnie czytać, ale ma tę zaletę, że jeśli klasy wymieniają każdą zmianę, twój kod może pozostać taki sam.

0

Myślałem, że wyrzucę to tam, związane z tym wątkiem na wypadek, gdyby ktoś się na niego natknął.

Powinieneś trzymać się z daleka od wywoływania zakresów metodami instancji. Szybko odkryjesz, że debugujesz problemy z wydajnością. Zakresy zawsze ZAWSZE wracają do bazy danych, niezależnie od tego, czy relacja jest uwzględniona.

tj.

class Show 
    has_many :episodes 

    def awesome_episodes 
    episodes.awesome # THIS IS BAD!! 
    # should stay in ruby land with episodes.select { |ep| ep.status == "awesome" } 
    # OR push a method #awesome? to the episode class and then the 
    # syntax becomes nicer: episodes.select(&:awesome?) 
    # This way, the onus is on the caller to include the relationship 
    end 
end 

class Episode 
    belongs_to :show 

    scope :awesome,()-> { where(status: 'awesome') } 
end 

shows = Show.includes(:episodes) 

shows.map do |show| 
    show.awesome_episodes # fires a query every loop 
end 
Powiązane problemy