【问题标题】:order_by in Mongoid along find_by, NoMethodError - undefined method `order_by'Mongoid 中的 order_by 沿 find_by,NoMethodError - 未定义的方法“order_by”
【发布时间】:2015-03-10 19:56:17
【问题描述】:

我必须使用 Mongoid 在 sinatra 应用程序中检索 mongodb 记录。 为此,我尝试使用以下查询对检索到的记录进行排序:

@bin = Bin.find_by(bin_id: params[:bin_id]).order_by(:created_at.desc)

但是我得到了 NoMethodError,

NoMethodError - undefined method `order_by' for #<Bin:0x00000101d24d60>:
/Users/harshsingh/Documents/Codes/mogreet-requestbin/app.rb:79:in `block in <class:App>'
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
/Users/harshsingh/.rvm/gems/ruby-2.1.2/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
...

我不确定为什么 order_by 不起作用,我尝试查看 Mongoid 文档但找不到任何对我有帮助的内容。

编辑:

抱歉,我忘了提,我在 Bin 文档中有一个嵌入文档,名为 Callback,关系为 embeds_many :callbacks 和 embedded_in :bin, :inverse_of =&gt; :bins,所以我想在一个特定 @ 中对 callbacks 文档进行排序987654329@ 基于created_at。

【问题讨论】:

  • 按照@basia 的建议,我通过在视图页面的for loop 中添加order_by(created_at: "desc") 解决了这个问题,类似于&lt;% for callback in @bin.callbacks.order_by(created_at: "desc") %&gt;。

标签: ruby-on-rails ruby mongodb sinatra mongoid


【解决方案1】:

find_by 返回单个文档:

#find_by(attrs = {}) {|result| ... } ⇒ 文档?

在给定条件的情况下找到第一个文档。

并且文档没有order_by 方法。如果您想找到所有带有 bin_id 的文档,请使用 where:

@bins = Bin.where(bin_id: params[:bin_id]).order_by(:created_at.desc)

请注意,我将实例变量切换为复数名称,因为它现在包含(可能)几个Bins。

【讨论】:

  • 我已经更新了我的问题,抱歉之前没有说清楚。
【解决方案2】:

问题编辑后,您似乎在此查询中缺少callbacks

@callbacks = Bin.find_by(bin_id: params[:bin_id]).callbacks.order_by(created_at: "desc")

【讨论】:

  • 是的,你是对的,我错过了查询中的回调。我这样做是因为我必须在每个 bin 中显示 bin 详细信息以及回调详细信息。我通过在视图页面的for loop 中添加order_by(created_at: "desc") 解决了这个问题,例如&lt;% for callback in @bin.callbacks.order_by(created_at: "desc") %&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多