Mam kilka modeli, które muszą mieć niestandardowe warunki wyszukiwania umieszczone na nich. Na przykład, jeśli mam model kontaktu, za każdym razem, gdy wywoływana jest funkcja Contact.find, chcę ograniczyć zwracane kontakty, które należą tylko do używanego konta.Nadpisywanie "Znajdź" w ActiveRecord DRY way
Uważam to za pośrednictwem Google (który ja trochę dostosowane):
def self.find(*args)
with_scope(:find => { :conditions => "account_id = #{$account.id}" }) do
super(*args)
end
end
Działa to doskonale, z wyjątkiem kilku okazjach gdzie ACCOUNT_ID jest niejednoznaczna więc dostosować go do:
def self.find(*args)
with_scope(:find => { :conditions => "#{self.to_s.downcase.pluralize}.account_id = #{$account.id}" }) do
super(*args)
end
end
Działa to również świetnie, ale chcę, aby był suchy. Teraz mam kilka różnych modeli, które chcę używać tego rodzaju funkcji. Jaki jest najlepszy sposób na zrobienie tego?
Po udzieleniu odpowiedzi, proszę dołączyć kod, aby pomóc naszym umysłom zrozumieć metaprogramowanie Ruby-fu.
(Używam Rails v2.1)
Dzięki Jean, który będzie działał uczta i jest chyba właściwa droga aby to zrobić. Wprowadzenie konta jest nowym dodatkiem do istniejącego kodu, więc domyślam się, że komplikowałem rzeczy, wychodząc z tej perspektywy. Po prostu przejdę i zmodyfikuję istniejący kod, który ma być zakreślony przez Konto. –