0

我有一个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)

但正如您所见, aGift也有一个gift_units_count字段。该字段记录了可用的数量单位Gift。如何查询GiftCategory具有Gift对象的对象gift_units_count > 0

我认为解决方案可能类似于此处描述的内容,但我自己无法接近。

4

2 回答 2

1

我已经多次尝试找到解决这个问题的方法,但总是放弃。我刚刚知道如何轻松模仿。它可能不是一种非常可扩展的方式,但它适用于有限的对象数量。关键是本文档中的一句话:

返回标准对象的模型上的类方法也被视为范围,并且也可以链接。

因此,无需在保存挂钩函数后编写 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

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

GiftCategories.with_gifts.where(:some_field => some_value)
于 2017-03-09T01:57:59.780 回答
-1

这本质上是不可能的,因为引用了该文档。

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

这将大致完成我上面所说的:

gift_category_ids = Gift.where(:gifts_unit_count.gt => 0).map {|g| g.gift_category_id}.uniq
for gift_category_id in gift_category_ids
  gift_category = GiftCategory.find(gift_category_id)
  # do something with this
end

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

于 2014-02-17T23:26:27.463 回答