2017-03-07 65 views
0

認真努力想出一個合理的範圍。Rails:在postgresql數據庫中搜索數組json字段

我想獲得一個模型列表,其中使用postgresql的json數組列中有一個特定的「類型」字段。

有人可以指出我在正確的方向,我也很好,這是一個類級別的方法,而不是範圍,我只需要一個所有Model.objects的列表。

主要模式是提交,其HAS_ONE:fmp_session - FmpSession具有場:project_data,這是PostgreSQL:JSON類型字段,包含一個JSON陣列。

因此,如果fmp_session.project_data'type'json鍵等於'CREW',我想要的是所有提交的活動記錄數組。

我寧願堅持使用activerecord或sql(或混合搭配),只留下AREL。

我的想法是這樣的:

Submission.joins(:fmp_session).where(
    'EXISTS(
     SELECT 1 from json_array_elements(
      "project_data" 
      ) project_data WHERE (
      project_data#>> "{type}" 
     ) = "CREW" 
    )' 
) 

從理論上講,這將搜索project_data陣列,並以#搜索它>>所以不要緊多少元素數組中 - 但我已經嘗試了近40個查詢的陰謀,並被卡住了。幫助我找到正確的查詢將一個表連接到另一個表並搜索json數組字段以獲取特定字符串。

UPDATE

要顯示數據庫部,這裏是表描述(在psql)和該表的所述schema.db段。此外,你應該知道

Column  | Type  |Modifiers 
---------------+-----------+----------------------------------------------------------- 
id   | integer | not null default nextval('fmp_sessions_id_seq'::regclass) 
project_data | json  | default '[]'::json 

和架構

create_table "fmp_sessions", force: :cascade do |t| 
    t.json  "project_data",  default: [] 
    t.json  "project_member_data", default: [] 
    t.datetime "created_at",      null: false 
    t.datetime "updated_at",      null: false 
    end 
+0

如果我理解你很好,你的DB中有JSON(保存爲文本?),對吧? – Jeremie

+0

如果你問它的數據類型是文本,那麼不,它是JSON,我使用的PostgreSQL 9.6與json類型字段(技術上是文本,是的,但它們被規定爲json或json數組) – trh

回答

0

大概在報價您的問題:

Submission.joins(:fmp_session).where(
    "EXISTS(
     SELECT 1 from json_array_elements(
      project_data 
      ) project_data WHERE (
      project_data#>> '{type}' 
     ) = 'CREW' 
    )" 
) 

UPD:回答評論

查詢是有用的:

SELECT project_data#>> '{name}' 
from json_array_elements(
'[ 
      { 
       "id": "1", 
       "name": "First", 
       "type": "CREW" 
      }, 
      { 
       "id": "2", 
       "name": "Second", 
       "type": "NOCREW" 
      }, 
      { 
       "id": "3", 
       "name": "Third", 
       "type": "CREW" 
      } 
]' 
      ) project_data 
WHERE project_data#>>'{type}' = 'CREW' 
; 


?column? 
---------- 
First 
Third 
(2 rows) 


SELECT EXISTS (SELECT 1 
from json_array_elements(
'[ 
      { 
       "id": "1", 
       "name": "First", 
       "type": "CREW" 
      }, 
      { 
       "id": "2", 
       "name": "Second", 
       "type": "NOCREW" 
      }, 
      { 
       "id": "3", 
       "name": "Third", 
       "type": "CREW" 
      } 
]' 
      ) project_data 
WHERE project_data#>>'{type}' = 'CREW' 
) 


exists 
-------- 
t 
(1 row) 
+0

Ya - 這是一個好主意,但那不是。我沒有正確的查詢,這只是我嘗試過的一些示例,哪些不起作用。該查詢運行,但不會產生結果。 :( – trh

+0

你可以在你的桌子上顯示幾行嗎? –