2017-03-07 64 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

你可以在你的桌子上显示几行吗? –