2015-04-17 8 views
6

Tutti,Come costruire scopo di ordinare titolo

Sto cercando di creare un ambito che ordinerà dal titolo (: titolo). La colonna del titolo risiede nel Post Model. Ho letto lo scopes section nella sezione di query del record attivo e lo one on StackOverFlow ma non è abbastanza chiaro. Qualcuno può indicarmi la giusta direzione?

devo 4 modelli: Commento Messaggio utente Pubblicità

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 

risposta

28

Quando non avere alcun default_scope con order:

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

Quando hai un default_scope con order allora si è necessario utilizzare reorder:

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

o order con unscope:

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

Il metodo reorder sostituisce l'ordine ambito predefinito.

+0

Grazie per aver chiarito questo per me Sharvy, ho funzionato, l'ho appena provato nella console di Rails! Sto aggiungendo questo alle mie note di Gist :) – SaintClaire33

9

Sfortunatamente semplice order non funziona. Active Record consente di specificare più ordini su una singola associazione (che ordinerà prima dalla colonna created_at e poi da title - il secondo ordine non cambierà nulla in questo caso). Devi dire ai binari che vuoi ignorare la precedente dichiarazione d'ordine usando il metodo reorder.

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

Questo ha bisogno di più visibilità! Usa 'riordina' se la tua associazione ActiveRecord ha già un ordine applicato ad essa. È molto probabile che se ti trovi a dover usare 'riordina' invece di semplice' ordine', hai un ambito predefinito nel tuo modello, che è un no-no. –