如何建立范围以订购标题

时间:2015-04-17 13:55:33

标签: ruby-on-rails ruby-on-rails-3.2 rails-activerecord

我正在尝试创建一个由title(:title)订购的范围。标题列位于Post Model中。我通读了Active Record查询部分和scopes section上的one on StackOverFlow,但不太清楚。有人可能指出我正确的方向吗?

我有4个模特:

Comment
Post
User
Advertisement
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 

2 个答案:

答案 0 :(得分:35)

如果您没有default_scope order

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方法会覆盖默认的范围顺序。

答案 1 :(得分:12)

不幸的是,简单order无效。 Active Record允许您在单个关联上指定多个订单(首先按created_at列排序,然后按title排序 - 在这种情况下,第二个订单不会更改任何内容)。您需要使用reorder方法告诉rails您要忽略先前的订单声明。

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