Mongoid:查询has_many关联具有特定字段值的对象

时间:2014-02-14 21:05:22

标签: ruby-on-rails mongodb ruby-on-rails-4 mongoid mongoid4

我有GiftCategory型号:

class GiftCategory
  include Mongoid::Document

  field :gifts_count, type: Integer
  has_many :gifts, :inverse_of => :gift_category
end

我有一个Gift型号:

class Gift
  include Mongoid::Document

  field :gift_units_count, type: Integer
  has_many :gift_units,      :inverse_of => :gift
  belongs_to :gift_category, :inverse_of => :gifts, :counter_cache => true

  after_save :update_counter

  def update_counter
    self.gift_category_id_change.each do |e|
      GiftCategory.reset_counters(e, :gifts) unless e.nil?
    end
  end
end

update_counter方法允许我计算Gift个对象属于GiftCategory的数量。这样我就可以这样仅查询具有一些GiftCategory个对象的Gift个对象:

GiftCategory.where(:gifts_count.gt => 0)

但正如您所见Gift也有gift_units_count字段。此字段记录Gift的可用数量单位。如何查询GiftCategory具有Gift gift_units_count > 0个对象的{{1}}个对象?

我认为解决方案可能类似于描述here,但我无法靠近自己。

2 个答案:

答案 0 :(得分:0)

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

  

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

因此,不是在保存钩子函数之后编写update_counter而是为了保存GiftCategory.gifts_count字段,你可以像这样定义一个类函数:

def self.with_gifts
  ids = GiftCategory.all.select{|gc| gc.gifts.gift_units_count > 0}.pluck(:id)
  GiftCategory.where(:id.in => ids)
end

优点是,您可以对关联的(礼品)模型执行各种查询,并返回那些满足这些查询的GiftCategory实例(对我来说就是这种情况),最重要的是,您可以链接更多查询,如这样:

GiftCategories.with_gifts.where(:some_field => some_value)

答案 1 :(得分:-1)

由于引用了该文档,因此这本身并不可能。

重要的是要记住GiftCategory实际上并不包含Gift。相反,Gift记录有一个名为gift_category_id的字段。您基本上需要查找具有Gift的{​​{1}}条记录,然后编译其gifts_unit_count > 0字段的列表,将它们唯一,然后检索这些记录。

这将大致与我上面所说的相同:

gift_category_id

据我所知,Mongoid不愿意为你做这样的事情。正如上面评论的那样,您可能需要考虑嵌入,这将允许您以这种方式进行查询,因为字段将存储在同一文档中。