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

时间:2014-11-13 14:54:52

标签: ruby-on-rails mongodb mongoid

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

这是我的背景:

class Pro
  include Mongoid::Document
  has_many :recommendations

  scope :lost, -> { where(:recommendation_ids => []) }
  scope :normal, -> { where(:recommendation_ids.ne => []) }
end

儿童收藏:

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

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

  

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

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

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)