Sql RAILS:如何查询其每个关联都具有非空属性的所有对象
我在Rails 3.0.5和PostgreSQL上工作 我有一款Sql RAILS:如何查询其每个关联都具有非空属性的所有对象,sql,ruby-on-rails,ruby-on-rails-3,postgresql,activerecord,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,Activerecord,我在Rails 3.0.5和PostgreSQL上工作 我有一款产品,它有许多产品 class Offer < ActiveRecord::Base has_many :products end class Product < ActiveRecord::Base belongs_to :offer end class Offer
产品
,它有许多产品
class Offer < ActiveRecord::Base
has_many :products
end
class Product < ActiveRecord::Base
belongs_to :offer
end
class Offer
当您在第三方服务中注册该产品时,该产品的id会更新。我们把它叫做service\u id
。我想要一个报价范围,它可以获得所有报价,每个产品都在第三方服务中注册。换句话说,我只对offer实例感兴趣,如果它的所有产品都有服务id
报价范围:连接(:products)。其中(“products.service\u id不为NULL”)
,只返回包含至少一个不为NULL的产品的报价
任何帮助都将不胜感激
(附言:很抱歉这个标题,我已经尽力解释了。)
编辑:
例如:如果我有两个报价:报价1和报价2。报价人有产品p1和p2,报价人有产品p3和p4。假设p1、p2和p3有服务,但p4没有。查询应该只返回Offer1。我认为您要做的是在产品上定义一个范围,然后将该范围加入到您的范围报价中:
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
然后只选择两个计算结果(产品计数和子查询结果)匹配的报价?这是另一种方法
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,在这种复杂的查询中,我认为最好选择最简单的解决方案,而不是使查询更加复杂 我记得这个railscast,它涵盖了完全相同的问题:它仍然得到至少一个“已服务”产品的报价,但不是所有的产品都已服务。但是谢谢!嗯……啊!。。那么,您是说假设您有5种产品,您希望查询返回适用于所有5种产品的任何报价实例吗?请输入一些模型代码和一个示例w/结果。我按照您的建议添加了一个示例。如果它的所有产品都有服务id,我会对offer实例感兴趣。如果它的一个产品没有服务id,那么offer不应该出现在查询中。
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)")