查询jsonb数组的部分值

时间:2019-01-09 10:10:35

标签: ruby-on-rails arel

在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获取id等于subscriptions的所有type中的Project个?

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

3 个答案:

答案 0 :(得分:0)

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

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

您不需要where AR或AREL查询,因为只需要ids即可在订阅中包含具有“项目”类型的类型,并且可以如上获得。

答案 1 :(得分:0)

这将使用自定义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

答案 2 :(得分:0)

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

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

然后我会得到红宝石的ID。