Dry

Witam.

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?

Pozdrawiam

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ść.

class Employee
named_scope :sorted, lambda { |*args| { :order => args.first || “name ASC” } }

Wtedy używasz tak:
@employees = Employee.sorted # posortuje po imieniu
@employees_rich = Employee.sorted(“salary DESC”) # posortuje po zarobkach, od najbogatszych

Daj znać czy o to ci chodziło :slight_smile:

Dziki chodziło 1 wersję.

A zanim napisałeś wpadłem na coś takiego.

W modelu:

	def self.ordered
		find(:all, :order => 'name')
	end

a w widoku, kontrolerze Employee.ordered

Co myślisz o tym rozwiązaniu?
A dlaczego nie polecasz w widoku?

Pzdrawiam

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.

Wszytko już działa z named_scope.
Dzięki wielkie za szczegółową odpowiedź.

Pozdrawiam.

Spoko :slight_smile:
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.

Akurat koncepcja MVC pozwala na odwoływanie się z widoku do modelu :smiley:

ale oczywiście zgadzam się, że nie powinno się tak robić