我用的是Rails3.2。
我有一个产品模型和一个变体模型。一个产品可以有许多变种。一个变体可以属于许多产品。
我想查找产品模型,只查找具有特定变量计数的产品,例如(伪代码):Product.where("Product.variants.count == 0")
如何使用activerecord实现这一点?
最佳答案
您可以使用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。这个解决方案的好处是,您不会将子查询作为条件来执行,这很可能会提高性能。