W wielu miejscach używam posortowanej listy pracownikwów Employee.find(:all, :order => ‘name’).
Gdzie, zgodnie z zasada DRY powinien umieścić Employee.find(:all, :order => ‘name’) aby kolumnę sortowania zmieniać w jednym miejscu, a nie w każdym gdzie używam tej posortowanej listy?
Jakiś helepr?
Nie do końca rozumiem co chcesz uzyskać. Piszesz, że wszędzie używasz listy posortowanej według imienia, a później piszesz, że zmieniasz kolumnę sortowania.
Rozważmy więc dwa przypadki.
Pierwszy: wszędzie używasz listy z posortowaniem według imienia.
W modelu Employee tworzysz named_scope:
class Employee
named_scope :sorted_by_name, :order => ‘name’
Później w kontrolerze (bo nie polecam w widoku) przypisujesz @employees = Employee.sorted_by_name
Drugi: Sortujesz za każdym razem według innej kolumny
W modelu Employee tworzysz named_scope w trochę inny sposób:
class Employee
named_scope :sorted_by, lambda { |sort| { :order => sort } }
W kontrolerze wtedy dajesz tylko to i wszystko działa: @employees = Employee.sorted_by(“salary”)
Może być też przypadek trzeci, że chcesz standardowo sortować według imienia, chyba że podasz inną wartość.
Wtedy używasz tak: @employees = Employee.sorted # posortuje po imieniu @employees_rich = Employee.sorted(“salary DESC”) # posortuje po zarobkach, od najbogatszych
Od wejścia Rails 2.1 wprowadzono named_scopes, które bardzo ułatwiają pracę, więc radzę stosować te rozwiązanie wszędzie gdzie to tylko jest możliwe.
Więcej na ten temat możesz poczytać np. tutaj: http://blog.drogomir.com/articles/2008/10/03/named-scope
Rozwiązanie, które podałeś jest ok i działa. Tak właśnie to trzeba było robić przed 2.1, bo nie było named_scope. Jednak dużo bardziej elegancko i na dodatek szybciej i wygodniej jest stosować named_scope.
W widoku zaś nie polecam używania tego, bo wtedy zaburzasz koncepcję MVC, bo dodajesz logikę do widoku. Tam musi być już tylko prezentacja.
Spoko
I na przyszłość postaraj się jak najwięcej używać named_scope. Jak już się przestawisz, to będzie to przychodzić naturalnie i zobaczysz, że rzeczywiście warto.