Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中包含哈希数组的键的JSONB查询_Ruby On Rails_Postgresql_Activerecord_Ruby On Rails 5_Jsonb - Fatal编程技术网

Ruby on rails Rails中包含哈希数组的键的JSONB查询

Ruby on rails Rails中包含哈希数组的键的JSONB查询,ruby-on-rails,postgresql,activerecord,ruby-on-rails-5,jsonb,Ruby On Rails,Postgresql,Activerecord,Ruby On Rails 5,Jsonb,我有一个Rails5项目,它的页面模型有一个JSONB列内容。因此,对于这个问题,结构看起来是这样简化到最低限度的: #<Page id: 46, content: {..., "media" => [{ "resource_id" => 143, "other_key" => "value", ...}, ...], ...}> 我如何编写查询,以在contentjsonb列的media键下查找所有资源id为所需数字的页面?这是我所做的一次尝试,但我认为不起作用

我有一个Rails5项目,它的页面模型有一个JSONB列内容。因此,对于这个问题,结构看起来是这样简化到最低限度的:

#<Page id: 46, content: {..., "media" => [{ "resource_id" => 143, "other_key" => "value", ...}, ...], ...}>
我如何编写查询,以在contentjsonb列的media键下查找所有资源id为所需数字的页面?这是我所做的一次尝试,但我认为不起作用,因为数组的每个项中都有其他键/值对: Page.wherecontent->'media'@>?,{resource\u id:'143'}.to\u json


编辑:这可以工作,但只会检查媒体数组中的第一个散列:Page.wherecontent->“media”->0->“resource\u id”=?,“143”

使用sql,这将为您提供所有具有资源id 143的页面:

select * from pages p where '{"resource_id": 143}' <@ ANY ( ARRAY(select jsonb_array_elements ( content -> 'media' ) from pages where id=p.id ) );
Postgresql有一个名为ANY的函数,它使用表单表达式运算符ANY数组。使用给定的运算符计算左侧表达式,并与数组的每个元素进行比较

由于ANY的右侧参数必须是数组而不是json数组,因此我们使用jsonb_array_elements方法将content->media json数组转换为一组行,然后使用array将这些行转换为数组


谢谢,这很有帮助。使用Rails而不是直接SQL,我创建了这个查询,它提供了我所需要的:Page.where'{\resource\u id\:?}''media,143如果您想搜索2个资源id,您将如何执行此操作?array_select=ARRAYselect jsonb_array_elements content->“media”select*来自第p页,其中“{resource\u id:143}”是的,应该可以。我想不出更好的方法来搜索多个资源ID。