2011-08-13 19 views
5

Foo has_many Bar. Chcę zrobić coś takiego:Zdefiniuj niestandardową metodę wyszukiwania w relacji ActiveRecord?

foo_instance.bars.find_with_custom_stuff(baz) 

Jak mogę określić find_with_custom_stuff tak, że jest ona dostępna na bars relacji? (A nie tylko metoda Bar klasa?)

aktualizacja

chcę zrobić coś bardziej skomplikowanego niż zakres. coś takiego:

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

zakresów na pasku będzie użyteczny tutaj. – rubish

+0

to, co chcę dodać, jest dużo bardziej skomplikowane niż zakres. –

+0

możesz zrobić wiele skomplikowanych rzeczy w zakresie, czy możesz je rozwinąć? – numbers1311407

Odpowiedz

5

celownicze, scope w szynach 3 i named_scope w szynach 2.

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

foo_instance.bars.custom_find(baz) 

scope powinien zwrócić zakres, więc biorąc pod uwagę aktualizację prawdopodobnie nie chcesz używać scope tutaj. Można napisać metodę klasy, choć i używać scoped dostęp do aktualnego zakresu, jak:

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

OIC. w porządku, to jest zakres. –

+0

@John Bachir: Prawdopodobnie nie chcesz utworzyć metody, która znajduje rekord i zwraca z niego atrybut, ponieważ łamie oczekiwania. Byłoby to łatwiejsze do zrozumienia, gdybyś użył nieco realistycznych przykładów. Rozważ "Post.find_tag ​​(" john ")'; co to wraca i co się dzieje? Spodziewałbyś się, że to naprawdę 'Post.find_by_author_name ('john'). Tags.first || "nieoznaczony"? – coreyward

+0

Wydaje mi się, że cała ta małpka mogła być tylko po to, by zilustrować to zagadnienie? na przykład jeśli metoda była "first_monkey" lub coś podobnego (i ": banana" został wyeliminowany z obrazu) nie sądzę, że to naprawdę złamie oczekiwania. (ale tak, metoda o nazwie find_by_custom_stuff, która wyszukuje ananasa i zwraca małpę, prawdopodobnie przesuwa granice zasady najmniejszego zaskoczenia :-P) – numbers1311407

Powiązane problemy