Rails 4默认范围

时间:2013-08-29 08:39:01

标签: ruby-on-rails-4 default-scope

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

default_scope order: 'external_updated_at DESC'

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

default_scope, -> { order: 'external_updated_at' }

8 个答案:

答案 0 :(得分:150)

应该只有:

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

default_scope接受一个块,lambda是scope()所必需的,因为有2个参数,name和block:

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

答案 1 :(得分:21)

这对我有用:

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

答案 2 :(得分:7)

这对我也很有用:

default_scope { order('created_at DESC') }

答案 3 :(得分:2)

这对我有用(只是为了说明哪里),因为我通过同样的问题来到这个主题。

default_scope { where(form: "WorkExperience") }

答案 4 :(得分:2)

您还可以使用lambda关键字。这对多行块非常有用。

default_scope lambda {
  order(external_updated_at: :desc)
}

相当于

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

default_scope { order(external_updated_at: :desc) }

答案 5 :(得分:1)

这适用于Rails 4

default_scope { order(external_updated_at: :desc) }

答案 6 :(得分:0)

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

别忘了->符号

答案 7 :(得分:0)

default_scope { 
      where(published: true) 
}

试试这个。