【问题标题】:How to build scope to order title如何建立范围以订购标题
【发布时间】:2015-04-17 13:55:32
【问题描述】:

我正在尝试创建一个按title(:title) 排序的范围。标题列位于 Post 模型中。我通读了 Active Record 查询部分的scopes sectionone 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 

【问题讨论】:

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


    【解决方案1】:

    当您没有任何default_scopeorder 时:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这需要更多的可见性!如果您的 ActiveRecord 关联已经应用了订单,请使用 reorder。如果您发现自己需要使用 reorder 而不是普通的 order,则很有可能您的模型中有一个默认范围,这是不行的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 2022-10-25
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多