Ruby on rails 类似于Rails中Postgres JSON数组字段的查询

Ruby on rails 类似于Rails中Postgres JSON数组字段的查询,ruby-on-rails,json,postgresql,sql-like,psql,Ruby On Rails,Json,Postgresql,Sql Like,Psql,我有一个名为messages的表,它有一个名为headers的jsonB列来存储消息头。看起来是这样的: [ { "name":"Cc", "field":{ "name":"Cc", "value":"\"abc@gmail.com\" <abc@gmail.com>&

我有一个名为messages的表,它有一个名为headers的jsonB列来存储消息头。看起来是这样的:

[
   {
      "name":"Cc",
      "field":{
         "name":"Cc",
         "value":"\"abc@gmail.com\" <abc@gmail.com>",
         "length":null,
         "charset":"UTF-8",
         "element":null,
         "address_list":{
            "addresses":[
               {
                  "data":{
                     "raw":"\"abc@gmail.com\" <abc@gmail.com>",
                     "error":null,
                     "group":null,
                     "local":"abc",
                     "domain":"gmail.com",
                     "comments":[

                     ],
                     "display_name":"abc@gmail.com",
                     "obs_domain_list":null
                  },
                  "parsed":true
               }
            ],
            "group_names":[

            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":14,
      "unparsed_value":"\"abc@gmail.com\" <abc@gmail.com>"
   },
   {
      "name":"Message-ID",
      "field":{
         "name":"Message-ID",
         "uniq":1,
         "value":"<sdasdasd+tkiCVQ@mail.gmail.com>",
         "length":null,
         "charset":"UTF-8",
         "element":{
            "message_ids":[
               "sdasdasd+tkiCVQ@mail.gmail.com"
            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":16,
      "unparsed_value":"<sdasdasd+tkiCVQ@mail.gmail.com>"
   },
   {
      "name":"Subject",
      "field":{
         "name":"Subject",
         "value":"Re: test email",
         "errors":[

         ],
         "length":null,
         "charset":"UTF-8",
         "element":null
      },
      "charset":"UTF-8",
      "field_order_id":19,
      "unparsed_value":"Re: test email"
   }
]

但这是投掷错误

您可以执行子查询以获取需要比较的元素,然后在where子句中使用它们:

Message
  .from(
    Message.select("
      id,
      headers,
      jsonb_array_elements(headers)->>'unparsed_value' AS unparsed_value,
      jsonb_array_elements(headers)->>'name' AS name
    "), :t
  )
  .select('t.*')
  .where("t.name = 'Subject' AND t.unparsed_value LIKE '%test%'")

您需要的查询如下所示:

[
   {
      "name":"Cc",
      "field":{
         "name":"Cc",
         "value":"\"abc@gmail.com\" <abc@gmail.com>",
         "length":null,
         "charset":"UTF-8",
         "element":null,
         "address_list":{
            "addresses":[
               {
                  "data":{
                     "raw":"\"abc@gmail.com\" <abc@gmail.com>",
                     "error":null,
                     "group":null,
                     "local":"abc",
                     "domain":"gmail.com",
                     "comments":[

                     ],
                     "display_name":"abc@gmail.com",
                     "obs_domain_list":null
                  },
                  "parsed":true
               }
            ],
            "group_names":[

            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":14,
      "unparsed_value":"\"abc@gmail.com\" <abc@gmail.com>"
   },
   {
      "name":"Message-ID",
      "field":{
         "name":"Message-ID",
         "uniq":1,
         "value":"<sdasdasd+tkiCVQ@mail.gmail.com>",
         "length":null,
         "charset":"UTF-8",
         "element":{
            "message_ids":[
               "sdasdasd+tkiCVQ@mail.gmail.com"
            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":16,
      "unparsed_value":"<sdasdasd+tkiCVQ@mail.gmail.com>"
   },
   {
      "name":"Subject",
      "field":{
         "name":"Subject",
         "value":"Re: test email",
         "errors":[

         ],
         "length":null,
         "charset":"UTF-8",
         "element":null
      },
      "charset":"UTF-8",
      "field_order_id":19,
      "unparsed_value":"Re: test email"
   }
]
从消息中选择*,其中 从jsonb_到_recordsetmessages.headers中选择true 作为xname文本,字段jsonb 其中name='Subject' 和字段->>“未分析的_值”,如“%test%”;
这会给你你想要的结果吗?

它会返回空数组@SebastianPalma我相信问题中的headers列包含一个哈希数组。你的包含一个散列。对@Leslongtingill,刚刚更新。谢谢你指出这一点。成功了!我可以知道为什么需要对消息表进行自内查询吗?不是自内@Rivu join?,只是您需要以某种方式访问这两列/值,以便在where子句中使用它们。最常见的情况是认为可以在select语句中获得它们,但其中的值不能在where中使用,所以应该选择from。