2017-05-05 44 views
0

不,這只是一個不是約會應用程序的例子。我的應用程序不同,也更復雜。SQL,rails:檢查我的記錄中的JSONB列是否有鍵值對

我有一個rails應用程序。我有2個桌子和寵物。衆議院有許多寵物。我的寵物表有一個名爲pet_description一個JSONB列包含寵物類型和性別的鍵值對,像這樣:

{ 
    "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查詢的查詢。它適用於如果我做這個查詢找到所有有寵物的房屋。

self.where("EXISTS (SELECT null FROM pets WHERE pets.house_id = houses.id)") 

但是,如果我想查詢所有具有特定寵物類型和性別的房屋,那麼我似乎無法得到此查詢工作。我是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)") 

還是讓Rails的照顧約PARAMS格式:

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

輝煌!謝謝伊利亞!你的答案完美無缺,你是明星! – GregF

相關問題