2017-03-07 4 views
0

合理的な範囲を考え出すのは真剣に苦労しています。Rails:postgresql db内の配列jsonフィールドを検索

postgresqlを使用してjson配列列の中に特定の "type"フィールドを持つモデルのリストを取得したいとします。

私は誰か正しい方向に向けることができますか、また、これはスコープの代わりにクラスレベルのメソッドであるといいです、私はすべてのModel.objectsのリストが必要です。

主なモデルはSubmissionで、これは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

テーブルから少数の列を見せることはできますか? –

関連する問題