基于具有has_many关联的子集合计数的查询始终显示无结果

我正在尝试查询子集合中的文档数量。

这是我的背景:

class Pro include Mongoid::Document has_many :recommendations scope :lost, -> { where(:recommendation_ids => []) } scope :normal, -> { where(:recommendation_ids.ne => []) } end 

和儿童collections:

 class Recommendation include Mongoid::Document belongs_to :pro end 

所以,现在我执行:

 >> Pro.lost.count 0 >> Pro.all.select{|p| p.recommendations.count == 0}.count 1 

我究竟做错了什么? 我也试过Pro.with_size(recommendation_ids: 0)和其他一些变化,但没什么新的。

任何想法都将受到高度赞赏,提前感谢。

Moped 2.0.1,Mongoid 4.0.0,Rails 4.0.6

您已将范围编码为在空数组中搜索ID,因此它始终搜索0个数组的数组。

 scope :lost, -> { where(:recommendation_ids => []) } 

也许是这样的,如果你想传递一个参数。

 scope :lost, ->(rec_ids) { where(:recommendation_ids => [rec_ids]) } 

我曾多次试图找到这个问题的解决方案并且总是放弃。 我只是想知道如何轻松模仿它。 它可能不是一种可扩展的方式,但它适用于有限的对象计数。 关键是这篇文章中的一句话,其中说:

返回条件对象的模型上的类方法也被视为范围,也可以链接。

因此,您可以定义类函数,而不是声明范围:

 def self.lost ids = Pro.all.select{|p| p.recommendations.count == 0}.map(&:id) Pro.where(:id.in => ids) end 

优点是,您可以对关联的(推荐)模型执行各种查询,并返回那些满足这些查询的Pro实例(对我来说就是这种情况),最重要的是,您可以链接进一步的查询,如下所示:

 Pro.lost.where(:some_field => some_value)