查找没有任何关联模型的所有记录

时间:2013-05-14 02:52:15

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我正在使用Rails 3.2。

我有一个产品型号和一个变体型号。产品可以有许多变体。变体可以属于许多产品。

我想对Products模型进行查找,只查找具有特定变量计数的产品,例如(伪代码):

Product.where("Product.variants.count == 0")

你如何使用activerecord进行此操作?

4 个答案:

答案 0 :(得分:5)

您可以使用LEFT OUTER JOIN返回所需的记录。当您使用LEFT OUTER JOIN时,Rails会发出includes

例如:

Product.includes(:variants).where('variants.id' => nil)

这将返回没有products的所有variants。您还可以使用明确的joins

Product.joins('LEFT OUTER JOIN variants ON variants.product_id = products.id').where('variants.id' => nil)

即使右侧不存在,LEFT OUTER JOIN也会返回联接左侧的记录。它会将null值放入相关列中,然后您可以使用它来检查否定状态,就像我上面所做的那样。您可以在此处详细了解左连接:http://www.w3schools.com/sql/sql_join_left.asp

这个解决方案的好处在于你不会将子查询作为条件,这很可能会更高效。

答案 1 :(得分:1)

products= Product.find(:all,:select => 'variant').select{|product| product.varients.count > 10}

这是rails 2.3,但只有activeRecord部分,你需要看到select部分

答案 2 :(得分:1)

我不知道有任何ActiveRecord方法可以做到这一点,但以下内容可以帮助您解决问题。这个解决方案的好处是在数据库方面完成了所有工作。

Product.where('(SELECT COUNT(*) FROM variants WHERE variants.product_id = products.id) > 0')

答案 3 :(得分:1)

如果您想提取具有特定非0数量变体的产品,您可以使用这样的东西(无可置疑地未经测试):

Product.select('product.id, product.attr1_of_interest, ... product.attrN_of_interest, variant.id, COUNT(*)')
       .joins('variants ON product.id = variants.product_id')
       .group('product.id, product.attr1_of_interest, ... product.attrN_of_interest, variant.id')
       .having('COUNT(*) = 5')  #(or whatever number manipulation you want to do here) 

如果您想允许0种产品,则必须使用上面的Sean解决方案。