Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql RAILS:如何查询其每个关联都具有非空属性的所有对象_Sql_Ruby On Rails_Ruby On Rails 3_Postgresql_Activerecord - Fatal编程技术网

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

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

我在Rails 3.0.5和PostgreSQL上工作

我有一款
产品
,它有许多
产品

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)")