【发布时间】:2011-12-27 16:44:57
【问题描述】:
抱歉初学者的问题。 我在资产和项目之间有 habtm 关系。假设我正在循环遍历所有资产,我想找到与此资产无关的所有项目,但这不起作用:
Project.includes(:assets).where("assets.id != ?", asset.id)
什么是正确的查询?
【问题讨论】:
标签: sql ruby-on-rails has-and-belongs-to-many
抱歉初学者的问题。 我在资产和项目之间有 habtm 关系。假设我正在循环遍历所有资产,我想找到与此资产无关的所有项目,但这不起作用:
Project.includes(:assets).where("assets.id != ?", asset.id)
什么是正确的查询?
【问题讨论】:
标签: sql ruby-on-rails has-and-belongs-to-many
如果您想查找与特定资产无关的所有项目,这样的方法应该可以工作(未经测试,因此根据需要进行调整):
Project.joins(:assets_projects).where("assets_projects.asset_id != ?", asset_id)
asset_id 是您的资产实例的id。
另外,您不应该遍历资产来查找与迭代当前资产相关的所有项目,这将意味着太多的数据库调用(这就是所谓的 N+1 问题 - 可以找到一个很好的解释,例如 here )。要通过一个查询查找与任何资产无关的所有项目,请执行以下操作:
Project.find_by_sql(%(
SELECT * FROM projects
WHERE NOT EXISTS (SELECT * FROM assets_projects WHERE assets_projects.project_id = projects.id)
))
【讨论】: