我有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,但我无法靠近自己。
答案 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不愿意为你做这样的事情。正如上面评论的那样,您可能需要考虑嵌入,这将允许您以这种方式进行查询,因为字段将存储在同一文档中。