Project.includes(:assets).where("assets.id != ?", asset.id)
什么是正确的查询?
答案 0 :(得分:0)
如果你想找到所有与特定资产无关的项目,那么这样的东西应该可行(它未经测试,因此需要调整):
Project.joins(:assets_projects).where("assets_projects.asset_id != ?", asset_id)
asset_id
是您的资产实例的id
。
此外,你不应该遍历资产来查找与迭代的当前资产相关联的所有项目,这意味着太多的数据库调用(这就是所谓的N + 1问题 - 可以找到一个很好的解释,例如{{3 }})。要仅使用一个查询查找与任何资产无关的所有项目,请执行以下操作:
Project.find_by_sql(%(
SELECT * FROM projects
WHERE NOT EXISTS (SELECT * FROM assets_projects WHERE assets_projects.project_id = projects.id)
))