在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
个?
我尝试使用@>
运算符没有成功。
答案 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。