Ruby on rails Rails中包含哈希数组的键的JSONB查询
我有一个Rails5项目,它的页面模型有一个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为所需数字的页面?这是我所做的一次尝试,但我认为不起作用
#<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。