【问题标题】:Query for non-existent habtm record查询不存在的 habtm 记录
【发布时间】:2011-12-27 16:44:57
【问题描述】:

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

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

什么是正确的查询?

【问题讨论】:

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


    【解决方案1】:

    如果您想查找与特定资产无关的所有项目,这样的方法应该可以工作(未经测试,因此根据需要进行调整):

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

    【讨论】:

    • 谢谢,但它似乎没有找到任何东西。我做了 Project.find_by_sql(["SELECT * FROM projects WHERE NOT EXISTS (SELECT * FROM assets_projects WHERE assets_projects.asset_id != ?)",asset.id])。有什么线索吗?
    • 我根据您的问题的新版本编辑了我的答案。希望它有所帮助,如果没有,请不要犹豫
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多