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)
不,这只是一个例子,不是宠物约会应用程序。我的应用程序不同且更复杂。
我有一个 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)