合理的な範囲を考え出すのは真剣に苦労しています。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
私がよく理解していれば、DBにJSON(テキストとして保存されていますか? – Jeremie
データ型がテキストであるかどうかを調べるには、JSON、PostgreSQL 9.6とjson型フィールドを使用しています(技術的にはテキストですが、jsonまたはjson配列として規制されています) – trh