2011-01-10 3 views

Respuesta

8

Trate Shirt.red
self.red sería un método de objeto. scope :red ya es un método de clase, por lo que no tiene que escribir un método find_red para realizar una consulta, Shirt.red ya lo hará.

1

Está llamando a un método de instancia haciendo return self.red.

Lo que se quiere lograr es

def find_red 
    return Shirt.red 
end 
1

Usted puede encontrar llamando self.class.red preferible a la Shirt.red propuesto en las otras respuestas. No es tan agradable de leer, pero tiene la ventaja de que si las clases nombran cada cambio, tu código puede permanecer igual.

0

Pensé en tirar esto relacionado con este hilo en caso de que alguien se tropiece con él.

Debe evitar los ámbitos de llamada desde métodos de instancia. Pronto se encontrará eliminando problemas de rendimiento. Los ámbitos SIEMPRE volverán a la base de datos independientemente de si se incluye una relación.

I.e.

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 
Cuestiones relacionadas