SQL、rails:检查我记录中的JSONB列是否有键值对

SQL, rails: check if the JSONB column in my record has a key-value pair

不,这只是一个例子,不是宠物约会应用程序。我的应用程序不同且更复杂。

我有一个 rails 应用程序。我有 2 tables 房子和宠物。一个房子有很多宠物。我的宠物 table 有一个名为 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

在我的 House 模型中,我有一个执行 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)")

谢谢! 格雷格

您可以尝试使用不同的引号:

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

或者让 Rails 处理参数格式:

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