2011-08-13 8 views
5

Foo has_many Bar. Quiero hacer algo como:¿Define un método de buscador personalizado en una relación de ActiveRecord?

foo_instance.bars.find_with_custom_stuff(baz) 

¿Cómo definir find_with_custom_stuff de modo que esté disponible sobre la relación bars? (Y no sólo un método Bar clase?)

actualización

Quiero hacer algo más complicado que un ámbito de aplicación. algo así como:

def find_with_custom_stuff(thing) 
    if relation.find_by_pineapple(thing) 
    relation.find_by_pineapple(thing).monkey 
    else 
    :banana 
    end 
end 
+1

alcances en la barra será útil aquí. – rubish

+0

lo que quiero agregar es mucho más complicado que un alcance. –

+0

puede hacer muchas cosas complicadas en un alcance, ¿puede dar más detalles? – numbers1311407

Respuesta

5

Scopes, scope en los carriles 3 y named_scope en los carriles 2.

class Bar 
    scope :custom_find, lambda {|baz| where(:whatever => baz) } 
end 

foo_instance.bars.custom_find(baz) 

scope debe devolver un ámbito, por lo que dada su actualización es probable que no desee utilizar scope aquí. Se puede escribir un método de clase, sin embargo, utilizar y acceder a scoped el ámbito actual, como:

class Bar 
    def self.custom_find(thing) 
    if bar = scoped.find_by_pineapple(thing) 
     bar.monkey 
    else 
     :banana 
    end 
    end 
end 
+0

OIC. de acuerdo, alcances es. –

+0

@John Bachir: Probablemente no desee crear un método que encuentre un registro y devuelva un atributo porque rompe las expectativas. Esto sería más fácil de entender si utilizara ejemplos un tanto realistas. Considera 'Post.find_tag ​​('john')'; ¿Qué devuelve eso y qué está sucediendo? ¿Esperarías que sea realmente 'Post.find_by_author_name ('john'). Tags.first || 'sin etiquetar'? – coreyward

+0

Creo que todo el negocio de los monos, por así decirlo, podría haber sido solo para ilustrar el punto? p.ej. si el método fue 'first_monkey' o algo similar (y': banana' fue eliminado de la imagen), no creo que esto realmente rompa las expectativas. (pero sí, un método llamado find_by_custom_stuff que busca por pineapple y devuelve un mono probablemente esté empujando los límites del principio de menor sorpresa :-P) – numbers1311407

Cuestiones relacionadas