[英]Activerecord Query postgres jsonb array for integer member
我有一個帶有 jsonb 列的下表 Profile
物品種類 | object_changes |
---|---|
“物品” | [{"customer_id": [1, 5], "other_id": 1}, {"customer_id": [4, 5], "other_id": 2}] |
“物品” | [{"customer_id": [3, 6], "other_id": 3}, {"customer_id": [3, 5], "other_id": 2}] |
我希望能夠使用活動記錄進行查詢以查找具有 customer_id 5 的所有行。
我嘗試執行以下操作,但不起作用
Profile.where("object_changes->'customer_id' @> '5'")
Profile.where("object_changes->'customer_id' @> ?::jsonb", [5].to_json)
Profile.where("? = ANY (object_changes->>'customer_id')", 5)
有誰知道我如何能夠在 Ruby on Rails 中進行此查詢。
我的 Rails 版本是 Rails 4.2,Ruby 版本是 2.4.10,我使用 postgres 作為我的數據庫
我認為您需要的是jsonb_to_recordset
和橫向連接的組合。
對於以下架構和數據
CREATE TABLE profiles (
id integer,
item_type text,
object_changes jsonb
);
INSERT INTO profiles2(id, item_type, object_changes) VALUES
(1, 'Item', '[{"customer_id": [1, 5], "other_id": 1}, {"customer_id": [4, 5], "other_id": 2}]'::jsonb),
(2, 'Item', '[{"customer_id": [3, 6], "other_id": 3}, {"customer_id": [3, 5], "other_id": 2}]'::jsonb),
(3, 'Item', '[{"customer_id": [4, 7], "other_id": 3}, {"customer_id": [8, 9], "other_id": 2}]'::jsonb);
像這樣的事情會起作用:
SELECT distinct profiles.*
FROM
profiles,
jsonb_to_recordset(profiles.object_changes) AS changes(customer_id integer[], other_id integer)
WHERE 5 = ANY(changes.customer_id);
id | item_type | object_changes
----+-----------+----------------------------------------------------------------------------------
2 | Item | [{"other_id": 3, "customer_id": [3, 6]}, {"other_id": 2, "customer_id": [3, 5]}]
1 | Item | [{"other_id": 1, "customer_id": [1, 5]}, {"other_id": 2, "customer_id": [4, 5]}]
(2 rows)
因此,帶有 AR 查詢界面的最終解決方案類似於(我對要查找的值進行了硬編碼,但我相信您明白這一點並且參數化不是問題):
Profile.find_by_sql(<<~SQL)
SELECT distinct profiles.*
FROM
profiles,
jsonb_to_recordset(profiles.object_changes) AS changes(customer_id integer[], other_id integer)
WHERE 5 = ANY(changes.customer_id)
SQL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.