我正在使用Rails 3.2。
我有一个产品型号和一个变体型号。产品可以有许多变体。变体可以属于许多产品。
我想对Products模型进行查找,只查找具有特定变量计数的产品,例如(伪代码):
Product.where("Product.variants.count == 0")
你如何使用activerecord进行此操作?
答案 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解决方案。