【问题标题】:How to sort column of table by value of another table row?如何按另一个表行的值对表的列进行排序?
【发布时间】:2021-08-18 18:19:26
【问题描述】:

有两个表:

id name
1 col1
2 col2
  1. 用户设置
id name params
1 user1 { "columns": [ {"col_id": 1, "place": 2}, {"col_id": 2, "place": 1} ], "anotherParam": "" }
2 user2 { "columns": [ {"col_id": 1, "place": 2}, {"col_id": 2, "place": 1} ], "anotherParam": "" }

我想获取所有列,例如:

@columns = Column.all

然后根据 "col_id" = columns.id 从 user_settings 表中按当前用户的参数值对其进行排序。 @columns 最后必须是 Column::ActiveRecord_Relation。

如何做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    对我而言,在这种情况下最好的策略是暂时忘记 ActiveRecord,在原始 SQL 中构建适当的解决方案,当一切就绪后将其“迁移”到 AR 查询 API。

    user_settings 表的 params 列对我来说看起来像 JSON 数据 - 这意味着解决方案实际上取决于您使用的数据库(因为不同的数据库 - 有时甚至是同一数据库的不同版本 - 提供不同的接口json 数据)。

    但总的来说,解决方案如下:将 json 数组“解包”到一个记录集中,将它加入到您需要的其他数据中,然后其他一切都很简单......

    例如,在 PostgreSQL 中它可能如下所示:

    select c.*
    from
      columns c,
      user_settings s,
      jsonb_to_recordset(s.params->'columns') as params(col_id integer, place integer)
    where c.id = params.col_id and s.id = 1
    order by params.place
    ;
    

    jsonb_to_recordset 将 json 数组转换为记录集,然后根据您的条件将此记录集与 columns 表连接,然后应用排序。

    这是包含您的示例数据的完整解决方案:http://sqlfiddle.com/#!17/ffaa19/1

    UPD。哎呀。您提到 AR_Relation 作为所需的输出。这可能有点棘手(find_by_sql 返回一个数组)。您能否添加更广泛的上下文 - 为什么在这种情况下获取 AR 关系至关重要?

    UPD2。根据更改后的数据样本更新答案。

    【讨论】:

    • AR 关系作为输出,因为接下来我在视图中使用@columns 变量。数据库 - postgres,是的。
    • 除了遍历@columns 并渲染它们之外,您是否在视图中做任何更复杂的事情?如果不是,那么数组的行为方式与 AR 关系的行为方式完全相同......
    • 是的,你是对的。我也可以使用数组。谢谢,但你能再次帮助查询吗?事实上,我的参数看起来像: { "columns": [ {"col_id": 1, "place": 2}, {"col_id": 2, "place": 1} ] } 。如何为此修改您的示例?
    • 能否用正确的数据样本更新问题?
    • @aaltw 我根据您更新的数据样本更新了答案。
    猜你喜欢
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2014-05-28
    • 1970-01-01
    • 2011-09-30
    相关资源
    最近更新 更多