Rails 4默认范围


74

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

default_scope order: 'external_updated_at DESC'

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

default_scope, -> { order: 'external_updated_at' }

相关:应该完全避免使用default_scope ,还有哪些替代方法?
2014年

Answers:


152

只能是:

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

default_scope接受一个块,对于scope(),lambda是必需的,因为有两个参数,名称和块:

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

谢谢您的解释,卢克。我遇到语法错误,然后将其更改为default_scope {order('external_updated_at')}并成功运行。您可以编辑您的答案,以便我补充吗?
乔·加特

6
如果没有箭头,这在4.0.2中对我不起作用。我的工作解决方案是default_scope -> { order_by(:created_at => :desc) }
genkilabs 2014年

1
按照惯例,在引用属性时首选使用符号。default_scope { order(:external_updated_at) }
scarver2,2014年

3
顺便说一句@JoeGatt问题的正确答案是default_scope order('external_updated_at DESC')
scarver2 2014年

如果您得到的结果大小写不同(大写还是小写),这将不解决排序问题。关于在强制小写的同时通过default_scope进行排序的任何想法?
基斯·布里格斯

21

这对我有用:

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

3
使用新的Ruby语法:default_scope { order(created_at: :desc) }
Jeehut 2015年


2

这对我有用(仅用于在何处进行说明),因为我是通过相同的问题来到这个主题的。

default_scope { where(form: "WorkExperience") }

2

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

default_scope lambda {
  order(external_updated_at: :desc)
}

相当于

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

default_scope { order(external_updated_at: :desc) }

1

这在Rails 4中对我有用

default_scope { order(external_updated_at: :desc) }

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

不要忘记->符号


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.