2015-04-17 102 views
6

全部,如何建立範圍命令標題

我想創建一個範圍,將由標題(:標題)排序。標題欄位於郵政模型中。我通過活動記錄查詢部分和one on StackOverFlow上的scopes section進行了解讀,但不太清楚。有人可能指向我正確的方向嗎?

我有4種型號: 評論 帖子 用戶 廣告

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 

回答

28

當你沒有任何default_scopeorder信息:

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

當你有一個default_scopeorder那麼你需要使用reorder

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

orderunscope

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

reorder方法覆蓋默認的範圍順序。

+0

謝謝你爲我澄清這件事Sharvy,這工作,我只是在Rails控制檯嘗試過!我將這添加到我的Gist筆記:) – SaintClaire33

9

不幸的是簡單order將無法​​正常工作。 Active Record允許您在單個關聯中指定多個訂單(首先按created_at列排序,然後按title排序 - 第二個排序在此情況下不會更改任何內容)。您需要使用reorder方法告訴導軌您要忽略以前的訂單陳述。

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

這需要更多的知名度!如果您的ActiveRecord關聯已經應用了訂單,請使用'reorder'。如果你發現自己需要使用reorder而不是普通的'order',那麼你的模型中有一個默認範圍是非常可能的,這是一個禁忌。 –