2017-05-05 38 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

相关问题