2017-05-05 3 views
0

いいえ、これはペットのデートアプリではありません。私のアプリは違って複雑です。SQL、rails:レコードのJSONB列にキーと値のペアがあるかどうかを確認してください

私はレールアプリを持っています。私は2つのテーブルハウスとペットがあります。家にはペットがたくさんいます。マイペットのテーブルには、JSONB列には、そのようなペットの種類や性別のキーと値のペアが含まれているpet_description呼ばれています:

{ 
    "dog"=>"male", 
    "cat"=>"female", 
    "parrot"=>"male" 
} 

をそして、このためのマイグレーションファイルは次のとおりです。私の家で

class AddPetDescriptionToPets < ActiveRecord::Migration 
    def change 
    add_column :pets, :pet_description, :jsonb, default: {} 
    add_index :pets, :pet_description, using: :gin 
    end 
end 

私はSQLクエリを実行するクエリを持っています。ペットを持つすべての家を見つけるためにこのクエリを実行すると機能します。

しかし、特定のペットの種類と性別を持つすべての家を照会する場合は、このクエリが機能しないようです。私はJSONBの新機能ですが、下のクエリで何が間違っていますか?、お手伝いください!!!!

self.where("EXISTS (SELECT null FROM pets WHERE pets.house_id = houses.id AND pets.pet_description @> '{'dog' : 'male'}'::jsonb)") 

感謝! グレッグ

答えて

0
あなたは異なる引用符記号を使用しようとするかもしれ

self.where("EXISTS ( 
    SELECT null 
    FROM pets 
    WHERE pets.house_id = houses.id 
    AND pets.pet_description @> '{\"dog\" : \"male\"}'::jsonb)") 

またはレールは、書式設定のparams気をつけましょう:

self.where("EXISTS ( 
    SELECT null 
    FROM pets 
    WHERE pets.house_id = houses.id 
    AND pets.pet_description @> ?)", {dog: 'male'}.to_json) 
+0

ブリリアント!ありがとうございます!両方の答えが完璧に働く、あなたは星です!!!! – GregF

関連する問題