2015-04-17 8 views
6

Wszystko,Jak zbudować zakres do zamówienia Tytuł

Próbuję utworzyć zakres, który będzie uporządkowany według tytułu (: title). Kolumna tytułu znajduje się w modelu postu. Przeczytałem scopes section w sekcji kwerendy Active Record i one on StackOverFlow, ale nie jest to całkiem jasne. Czy ktoś może mnie wskazać we właściwym kierunku?

mam 4 modele: komentarz post użytkownika Reklama

class Post < ActiveRecord::Base 
attr_accessible :body, :title, :user 
has_many :comments 
belongs_to :user 
default_scope {order('created_at DESC')} 
scope :ordered_by_title {order('title')} #What I initially built 

end 

Odpowiedz

28

Gdy nie ma żadnych default_scope z order:

scope :ordered_by_title, -> { order(title: :asc) } 

Kiedy masz default_scope z order wtedy należy użyć reorder:

default_scope { order(created_at: :desc) } 
scope :ordered_by_title, -> { reorder(title: :asc) } 

lub order z unscope:

default_scope { order(created_at: :desc) } 
scope :ordered_by_title, -> { order(title: :asc).unscope(:order) } 

Sposób reorder zastępuje kolejności domyślnej zakresu.

+0

Dziękuję za wyjaśnienie tego dla mnie Sharvy, działało to po prostu wypróbowałem to w konsoli Railsów! Dodaję to do moich notatek Gist :) – SaintClaire33

9

Niestety prosty order nie będzie działać. Rekord aktywny pozwala określić wiele zleceń na jednym powiązaniu (które będzie najpierw zamawiać przez kolumnę created_at, a następnie przez title - drugie zamówienie niczego nie zmieni w tym przypadku). Musisz powiedzieć szynom, że chcesz zignorować poprzednią instrukcję zamówienia, używając metody reorder.

scope :ordered_by_title, -> { reorder(title: :asc) } 
+0

To wymaga większej widoczności! Użyj 'reorder ', jeśli twoje stowarzyszenie ActiveRecord ma już zlecenie do niego zastosowane. Jest bardzo możliwe, że jeśli będziesz potrzebował użyć 'reorder 'zamiast zwykłego' order', masz domyślny zakres w swoim modelu, który jest nie-nie. –