查询不存在的habtm记录

时间:2011-12-27 16:44:57

标签: sql ruby-on-rails has-and-belongs-to-many

抱歉初学者的问题。 我有资产和项目之间的关系。假设我正在循环遍历所有资产,我想找到所有与此资产无关的项目,但这不起作用:

Project.includes(:assets).where("assets.id != ?", asset.id)

什么是正确的查询?

1 个答案:

答案 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)
))