我用的是Rails3.2。
我有一个产品模型和一个变体模型。一个产品可以有许多变种。一个变体可以属于许多产品。
我想查找产品模型,只查找具有特定变量计数的产品,例如(伪代码):
Product.where("Product.variants.count == 0")
如何使用activerecord实现这一点?

最佳答案

您可以使用LEFT OUTER JOIN返回所需的记录。当您使用LEFT OUTER JOIN时,rails会发出includes命令。
例如:

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

这将返回所有没有productsvariants。也可以使用显式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
这个解决方案的好处是,您不会将子查询作为条件来执行,这很可能会提高性能。

09-25 19:47