我正在尝试创建一个由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
答案 0 :(得分:35)
如果您没有default_scope
order
:
scope :ordered_by_title, -> { order(title: :asc) }
如果default_scope
有order
,那么您需要使用reorder
:
default_scope { order(created_at: :desc) }
scope :ordered_by_title, -> { reorder(title: :asc) }
或order
与unscope
:
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) }