在 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。