Mongoid Rails 4 按 asc 或 desc order created_at 排序

Posted

技术标签:

【中文标题】Mongoid Rails 4 按 asc 或 desc order created_at 排序【英文标题】:Mongoid Rails 4 sort by asc or desc order created_at 【发布时间】:2014-07-25 01:35:54 【问题描述】:

我有一个使用 Mongoid 的 rails 4 应用程序。 我想做一些基本的事情是根据索引视图中的 created_at 字段按降序显示我拥有的书籍模型。 在控制器books_controller.rb中:

def index
  @books = Book.order_by(:created_at.desc)
end

这不起作用。我还尝试了以下两种不起作用:

@books = Book.find :all, :order => "created_at DESC"

Book.find(:all, :order => "created_at DESC").each do |item|
  @books << item
end

在视图中我有这样的东西:

<% @books.each do |b| %>
  ...
<% end %>

谢谢。

【问题讨论】:

什么意思?你有什么错误吗? 【参考方案1】:
def index
  @books = Book.desc(:created_at)
end

效果很好。

【讨论】:

【参考方案2】:

你可以试试这个

def index
  @books = Book.order_by(created_at: :desc)
end

效果很好。

【讨论】:

小改进:@books = Book.order_by(created_at: :desc)【参考方案3】:

Book.where(author: "Stephen King").sort("created_at": 1)--> 升序

Book.where(author: "Stephen King").sort("created_at": -1) --> 降序

【讨论】:

语法错误,加上sort 似乎不是现有方法。 编辑了语法错误。使用 mongoid gem 时可以使用排序选项。立即尝试。 感谢您的编辑。 Book.sort("created_at": 1) 对我仍然无效,但 Book.where(author: "Stephen King").sort("created_at": 1) 有效。【参考方案4】:

您可以同时使用“order”和“order_by”,它们是等价的。 所有这些都是等价的:

Book.order_by(created_at: :desc)
Book.order_by(created_at: -1)
Book.order(created_at: :desc)
Book.order(created_at: -1)

这是来自 mongoid 5.1.3 "lib/mongoid/criteria/queryable/optional.rb" 的源代码:

# Adds sorting criterion to the options.
#
# @example Add sorting options via a hash with integer directions.
#   optional.order_by(name: 1, dob: -1)
#
# @example Add sorting options via a hash with symbol directions.
#   optional.order_by(name: :asc, dob: :desc)
#
# @example Add sorting options via a hash with string directions.
#   optional.order_by(name: "asc", dob: "desc")
#
# @example Add sorting options via an array with integer directions.
#   optional.order_by([[ name, 1 ], [ dob, -1 ]])
#
# @example Add sorting options via an array with symbol directions.
#   optional.order_by([[ name, :asc ], [ dob, :desc ]])
#
# @example Add sorting options via an array with string directions.
#   optional.order_by([[ name, "asc" ], [ dob, "desc" ]])
#
# @example Add sorting options with keys.
#   optional.order_by(:name.asc, :dob.desc)
#
# @example Add sorting options via a string.
#   optional.order_by("name ASC, dob DESC")
#
# @param [ Array, Hash, String ] spec The sorting specification.
#
# @return [ Optional ] The cloned optional.
#
# @since 1.0.0
def order_by(*spec)
  option(spec) do |options, query|
    spec.compact.each do |criterion|
      criterion.__sort_option__.each_pair do |field, direction|
        add_sort_option(options, field, direction)
      end
      query.pipeline.push("$sort" => options[:sort]) if aggregating?
    end
  end
end
alias :order :order_by

【讨论】:

【参考方案5】:
def index
   @books = Book.order(:created_at => 'desc')
end

它对我有用,而不是 order_by 使用 order(取决于 rails 版本)

【讨论】:

以上是关于Mongoid Rails 4 按 asc 或 desc order created_at 排序的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Mongoid 4.0.0 _id 包含 . (点)不能通过参数查询(Rails 4)

如何在 Mongoid & Rails 中使用数组字段?

在 Rails 3 上使用 Rspec 和 MongoID 清理或重置测试数据库

如何避免在 MongoDB(使用 Mongoid)或 ActiveRecord(使用 MySQL 的 Rails)中插入两次相同的记录?

如何将内存中的 MongoDB 与 Rails、Mongoid 和 Rspec 一起使用?

Mongoid 查找器不起作用?