RAILS:如何查询每个关联都具有非null属性的所有对象

我正在研究Rails 3.0.5和PostgreSQL。

我有一个型号Offer ,有很多Products

 class Offer < ActiveRecord::Base has_many :products end class Product < ActiveRecord::Base belongs_to :offer end 

当您在第三方服务中注册时,该产品的ID会更新。 让我们称之为service_id 。 我想要一个优惠范围,它可以获得在第三方服务中注册的每个产品的所有优惠。 换句话说,如果它的所有产品都有服务ID,我只对商品实例感兴趣。

offer范围: joins(:products).where("products.service_id is not NULL") ,只返回至少有一个非null产品的商品。

任何帮助,将不胜感激。

(PS:对不起标题,我尽力解释它。)

编辑:

例如:如果我有2个优惠:Offer1和Offer2。 Offer1的产品为p1和p2,Offer2的产品为p3和p4。 假设p1,p2和p3有服务但p4没有服务。 查询应仅返回Offer1。

这是另一种方法。

 Offer.find_by_sql("SELECT * FROM offers o WHERE NOT EXISTS (SELECT * FROM products WHERE products.offer_id = o.id AND service_id IS NULL)") 

甚至ORM的想法是你抽象SQL,在这种复杂的查询中,我认为最好选择最简单的解决方案而不是使查询复杂化。

我相信你想要做的是定义产品的范围,然后将该范围加入你的范围提供:

 class Product < ActiveRecord::Base scope :serviced, where('products.service_id is not NULL') end class Offer < ActiveRecord::Base scope :with_serviced_products, joins(:products) & Product.serviced end 

编辑:

嗯,现在我明白你的问题,我没有完整的答案。 只是一些想法。 听起来你需要至少一个子选择查询和一些Group Bys。 如果..

您使用rails在您的商品product_count的商品模型上保留一个反缓存。

您可以计算每个商品的服务产品数量。 就像是,

 Product.serviced.group_by(:offer_id).count 

然后只选择两个计数的商品,它的products_count和子查询的结果匹配?