2013-08-29 146 views
70

在我的Rails應用程序有一個默認的範圍,看起來像這樣:的Rails 4默認範圍

default_scope order: 'external_updated_at DESC' 

我現在已經升級到Rails 4,當然,我得到以下棄用警告「電話#scope或帶有散列的#default_scope已棄用,請使用包含範圍的lambda。「我已經成功地轉換了其他範圍,但我不知道default_scope的語法應該是什麼。這不起作用:

default_scope, -> { order: 'external_updated_at' } 
+0

相關:應default_scope是[完全避免](https://github.com/rails/rails/issues/13965 #issuecomment-34407465),還有哪些替代方法? – Jay

回答

146

應該是唯一的:

class Ticket < ActiveRecord::Base 
    default_scope { order(:external_updated_at) } 
end 

default_scope接受塊,拉姆達是必要的範圍(),因爲有2個參數,名稱和模塊:

class Shirt < ActiveRecord::Base 
    scope :red, -> { where(color: 'red') } 
end 
+0

謝謝你的解釋,盧克。我有一個語法錯誤,然後我將其更改爲default_scope {order('external_updated_at')}並且它工作正常。你可以編輯你的答案,所以我可以承認它? –

+5

沒有箭頭的情況下,這在4.0.2中不起作用。我的工作解決方案是'''default_scope - > {order_by(:created_at =>:desc)}'' – genkilabs

+1

按照慣例,引用屬性時首選符號。 'default_scope {order(:external_updated_at)}' – scarver2

21

這是對我工作:

default_scope { order(:created_at => :desc) } 
+1

謝謝@蕾絲莉。這在Rails 4中工作,而不是Rails 3. – scarver2

+3

在新的Ruby語法中:'default_scope {order(created_at::desc)}' – Dschee

7

這也爲我工作:

default_scope { order('created_at DESC') }

1

這從我工作(只是爲了說明一個地方),因爲我通過同樣的問題來到了這個話題。

default_scope { where(form: "WorkExperience") } 
1

這對我的作品在軌道4,5

default_scope { order(external_updated_at: :desc) } 
0
default_scope -> { order(created_at: :desc) } 

不要忘了->符號

0
default_scope { 
     where(published: true) 
} 

嘗試。

2

您還可以使用lambda關鍵字。這對多行塊很有用。

default_scope lambda { 
    order(external_updated_at: :desc) 
} 

這相當於

default_scope -> { order(external_updated_at: :desc) } 

default_scope { order(external_updated_at: :desc) }