Gwiazdka w zapytaniu ActiveRecord

Hej

Czy da się zrobić coś na miare gwiazdki w zapytaniu?

Obecnie mam coś takiego:

Place.where("city = :city", {:city => amiasto}).size # => np 3

Żeby przypisać do zmiennej amiasto taką gwiazdkę aby wyszukiwało wszystkie miasta?

Gwiazdka (*) albo pusty string( “” ) nie działa.

Da się uzyskać takie wyniki?

Place.count

Znam to komendę, tylko sęk w tym, że już kod mam naklepany w paru miejscach i nie chciał bym tworzyć IFów

if amiasto && amiasto != "" Place.where("city = :city", {:city => amiasto}).size # => np 3 else Place.count end
Tylko po prostu przypisać jakąś wartość do amiasto żeby ta składnia działała

Place.where("city = :city", {:city => amiasto}).size # => np 3

tak jak

Place.count

Moje propozycja (Rails3) :

places = Place.scoped places = places.where(:city => city) if city.present? places.count

Ify są faktycznie słabe ale powtórzony kod w paru miejscach jeszcze gorszy. Wyciągnij logikę do jednej metody i tyle.

@paneq
Gdyby tylko to było dla modelu Place to ok. Ale to jest taki scope dla wielu modeli. Łącznie będzie gdzieś koło 5-6…

Hmm a może takie wyjście że taka metoda która miała by podawany model albo polimorficznie by był ten scoped wywoływany. Da się coś takiego napisać? Pewnie da :), tylko nie wiem jak się za coś takiego zabrać.

[code]module SearchableByCity
def count_by_city(city = nil)
scope = self.scoped
scope = scope.where(:city => city) if city.present?
scope.count
end
end

Place.extend(SearchableByCity)
Event.extend(SearchableByCity)
#etc

Place.count_by_city(nil) # => 100
Place.count_by_city("") # => 100
Place.count_by_city(“Wroclaw”) # => 7
Event.count_by_city()[/code]

WoW. :slight_smile:

Dzięki paneq.

Edycja:
Moduły standardowo idą do /lib?

Nie ma czegoś takiego jak “standardowo idą do”. Wrzucasz tam gdzie uważasz za słuszne. Ja wrzucam do lib to co stanowi dla mnie szkielet, rozbudowe railsow, frameworku. Jesli cos nie jest zwiazane z modelem jakims lub mogloby potencjalnie zostac uzyte ponownie w innym projekcie. To co napisalem wydaje mi sie zwazane z modelem wiec raczej bym trzymal to w app