74

在我的 Rails 应用程序中有一个默认范围,如下所示:

default_scope order: 'external_updated_at DESC'

我现在已经升级到 Rails 4,当然,我收到以下弃用警告“不推荐使用带有哈希的 #scope 或 #default_scope。请使用包含范围的 lambda。”。我已经成功地转换了我的其他范围,但我不知道 default_scope 的语法应该是什么。这不起作用:

default_scope, -> { order: 'external_updated_at' }
4

8 回答 8

152

Should be only:

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

default_scope accept a block, lambda is necessary for scope(), because there are 2 parameters, name and block:

class Shirt < ActiveRecord::Base
  scope :red, -> { where(color: 'red') }
end
于 2013-08-29T08:44:37.803 回答
21

这对我有用:

default_scope  { order(:created_at => :desc) }
于 2014-02-07T09:31:27.073 回答
7

这也对我有用:

default_scope { order('created_at DESC') }

于 2014-04-21T17:54:07.170 回答
2

这对我有用(只是为了说明一个地方),因为我是通过同样的问题来讨论这个话题的。

default_scope { where(form: "WorkExperience") }
于 2014-10-08T12:51:22.593 回答
2

您也可以使用lambda关键字。这对于多行块很有用。

default_scope lambda {
  order(external_updated_at: :desc)
}

这相当于

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

default_scope { order(external_updated_at: :desc) }
于 2016-09-26T16:30:52.873 回答
1

这在 Rails 4 中对我有用

default_scope { order(external_updated_at: :desc) }
于 2014-12-30T09:48:02.567 回答
0
default_scope { 
      where(published: true) 
}

尝试这个。

于 2016-09-07T14:07:21.770 回答
0
default_scope -> { order(created_at: :desc) }

不要忘记->符号

于 2016-08-25T15:29:07.180 回答