ruby-on-rails - Rails 中 Postgres JSON 数组字段的 LIKE 查询

标签 ruby-on-rails json postgresql sql-like psql

我有一个名为 messages 的表,其中有一个名为 headersjsonB 列来存储消息 header 。它看起来像这样:

[
   {
      "name":"Cc",
      "field":{
         "name":"Cc",
         "value":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d7b6b5b497b0bab6bebbf9b4b8ba" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="1776757457707a767e7b3974787a" rel="noreferrer noopener nofollow">[email protected]</a>>",
         "length":null,
         "charset":"UTF-8",
         "element":null,
         "address_list":{
            "addresses":[
               {
                  "data":{
                     "raw":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5130333211363c30383d7f323e3c" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92f3f0f1d2f5fff3fbfebcf1fdff" rel="noreferrer noopener nofollow">[email protected]</a>>",
                     "error":null,
                     "group":null,
                     "local":"abc",
                     "domain":"gmail.com",
                     "comments":[

                     ],
                     "display_name":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2d4c4f4e6d4a404c4441034e4240" rel="noreferrer noopener nofollow">[email protected]</a>",
                     "obs_domain_list":null
                  },
                  "parsed":true
               }
            ],
            "group_names":[

            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":14,
      "unparsed_value":"\"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="94f5f6f7d4f3f9f5fdf8baf7fbf9" rel="noreferrer noopener nofollow">[email protected]</a>\" <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ea8b8889aa8d878b8386c4898587" rel="noreferrer noopener nofollow">[email protected]</a>>"
   },
   {
      "name":"Message-ID",
      "field":{
         "name":"Message-ID",
         "uniq":1,
         "value":"<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92e1f6f3e1f6f3e1f6b9e6f9fbd1c4c3d2fff3fbfebcf5fff3fbfebcf1fdff" rel="noreferrer noopener nofollow">[email protected]</a>>",
         "length":null,
         "charset":"UTF-8",
         "element":{
            "message_ids":[
               "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="daa9bebba9bebba9bef1aeb1b3998c8b9ab7bbb3b6f4bdb7bbb3b6f4b9b5b7" rel="noreferrer noopener nofollow">[email protected]</a>"
            ]
         }
      },
      "charset":"UTF-8",
      "field_order_id":16,
      "unparsed_value":"<<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="097a6d687a6d687a6d227d62604a5f584964686065276e64686065276a6664" rel="noreferrer noopener nofollow">[email protected]</a>>"
   },
   {
      "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"
   }
]

我想要搜索 'name' = 'Subject' 和 'unparsed_value' 的记录(如 %test%)并在 Rails 6.0.2 中返回结果?

我正在尝试下面提到的代码:

messages.where("headers @> '[{\"name\": \"Subject\"}, {\"unparsed_value\" LIKE \"%test%\"}]'")

但它抛出错误!

最佳答案

您可以执行子查询来获取需要比较的元素,然后在 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%'")

关于ruby-on-rails - Rails 中 Postgres JSON 数组字段的 LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62759600/

相关文章:

javascript - 多次应用日期过滤器

ruby-on-rails - 在 Rails 3 中,我得到了一个用于回收的 NoMethodError!测试过程中的方法

ruby-on-rails - 如何拥有线程安全的 Rails 初始化器?

ruby-on-rails - unicorn 服务 Upstart 脚本抛出 "-su: bundle: command not found"

python - 使用python中的子进程自动从普通用户切换到root

sql - 将 get_absolute_url 组合成 django 中的原始 SQL 语句

ruby - 如何使用后续 ORM 和 postgresql 对 sum 和 count 进行分组?

ruby-on-rails - bundle exec rake 测试抛出错误

java - 如何在 Internet Explorer 中显示 JSON 对象

ios - 使用 Alamofire 解析 Codable 响应