【问题标题】:Querying between two tables that share an association在共享关联的两个表之间进行查询
【发布时间】:2017-08-15 21:54:27
【问题描述】:

一般来说是 seqeul 和 sql 的新手。我有两个表groupsresources,它们关联many_to_many,因此有一个groups_resources 连接表。我还有一个task 表,它有一个foreign_key :group_id, :groups,并且与many_to_one 相关联。

我正在尝试根据任务的组确定使用什么查询,这将允许我获取能够执行任务的资源。我是否必须通过 `groups_resources' 连接表进行复杂的查询,或者是否有更直接的查询/设置关联的方式?

谢谢!

【问题讨论】:

    标签: sql ruby sequel


    【解决方案1】:

    我将按如下方式构建 SQL 语句。它将通过连接表为您提供与特定任务 ID 关联的资源对象。

    SELECT r.*
    FROM resources r
    JOIN groups_resources gr ON gr.resources_id = r.id
    JOIN groups g ON gr.group_id = g.id
    JOIN task t ON t.id = g.id
    WHERE t.id = ?
    

    【讨论】:

      【解决方案2】:

      我认为以下就足够了:

      select res.* from resources res, task tk, groups_resources gr
      where res.resource_id = gr.resource_id and
      gr.group_id = tk.group_id and
      tk.group_id=<>;
      

      【讨论】:

        【解决方案3】:

        其他两个答案对于如何构建 SQL 查询很有帮助,但我想我会专门回答我自己的问题,因为它与 Sequel 相关。原来有一个many_through_many 插件可以让这种查询变得简单,如果你同时创建两个表many_to_many

        Task.plugin :many_through_many
        Task.many_through_many :resources,
          :through =>[
            [:groups_tasks, :task_id, :group_id],
            [:groups, :id, :id],
            [:groups_resources, :group_id, :resource_id]
          ]
        

        现在您可以在 Task 实例上调用类似 task.resources 的内容,即使您的表没有明确关联任务和资源。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-18
          • 2017-02-20
          • 1970-01-01
          • 2021-09-25
          • 1970-01-01
          • 2016-03-05
          • 1970-01-01
          • 2012-06-02
          相关资源
          最近更新 更多