查询 jsonb 数组以获取部分值



在 Rails 5.2 应用程序中,User 模型具有 subscriptions jsonb 属性

t.jsonb "subscriptions", default: [], null: false

一个例子是

irb(main):091:0> User.first.subscriptions
=> [{"id"=>"dfdaad60", "type"=>"Organization"}, 
    {"id"=>"18616f4d", "type"=>"Project"}]

我如何使用 arel 获得具有相等Project的所有subscriptions type id

我曾尝试使用@>运算符但没有成功。

以下内容将返回用户订阅(类型为"项目")的ids数组,

User.pluck(:subscriptions).flatten.map { |x| x['id'] if x['type'] == 'Project' }.compact

您不需要where AR或AREL查询,因为您只需要ids订阅中存在具有"Project"的类型,并且可以如上所述获取。

这将使用自定义 SQL 语句来完成这个技巧:

sql = "SELECT value->'id' AS id FROM users, jsonb_array_elements(users.subscriptions) WHERE data @> '#{[{type: "Project"}].to_json}'"
result = ActiveRecord::Base.connection.execute(sql)
puts result.to_a

您可以使用 ActiveRecordExtended gem 查找具有项目类型订阅的所有用户:

User.where.contains(subscriptions: { type: "Project" })

然后我会在红宝石中得到 ID。

最新更新