Przeszukiwanie instancji czy named_scope

Mam tablice wydarzeń (z datą startu i zakończenia), w widoku akcji index wydarzenia te mają być pogrupowane na Dziś, Tydzień od dziś, Miesiąc od dziś itp. w sumie 5 bloków.

I teraz, tworzyć nowe instancje np:

def index @evens_today = Event.today @evens_next_week = Event.next_week @evens_next_month = Event.next_month ... end
Bardzo wygodne dla mnie, ale to 5 zapytań do bazy.

Czy może pobrać wszystkie wydarzenia “@events = Event.all” i w widoku zrobić coś w stylu

<% @events.each do |event| %> <%= render :partial => "events_list_item", :locals => { :event => event } if today(event)%> <% end %>
i napisać helpery z warunkami które będą sprawdzać datę w każdym evencie i na jej podstawie renderować pratial z danym wydarzeniem, albo i nie.

Jak powinno się rozwiązać coś takiego?

Według mnie 5 zapytań do bazy będzie o wiele mniej kosztowne, niż przetwarzenie tego po stronie aplikacji.
Zastanawiam się czy najlepszym rozwiązaniem nie było by wywołanie namescopów bezpośrednio w widoku, np:

<%= render :partial => "events", :collection => Event.next_week %> <%= render :partial => "events", :collection => Event.next_month %>

A benchmark jakiś stoi za takim stwierdzeniem czy tylko wydaje Ci się? :wink:

Niezależnie od wyniku benchmarku, nawet jeśli 5 zapytań do bazy będzie mniej kosztowne niż wyciągnięcie wszystkich które mogą nas interesować (Event.next_two_months.all, also: wątpię) i przetworzenie po stronie aplikacji, to potem – w miarę skalowania aplikacji – będziesz starał się jak najmniej robić w bazie (bo ją się najtrudniej skaluje), a jak najwięcej w aplikacji właśnie.

Wszystko zależy od tego ile tych eventów może być. Jeżeli będzie ich 100, to pobranie wszystkich i pogrupowanie w ruby nie powinno zająć dużo czasu. Jeżeli kilka tysięcy, to nie ma mowy o przenoszeniu czegokolwiek na aplikację. Ja bym się nie zastanawiał tylko zrobił 5 zapytań i jak kiedyś to się stanie bottleneckiem, to się tym zajmiesz.