ruby-on-rails - Rails ransack gem 以键值对作为参数搜索 jsonb 列

标签 ruby-on-rails ruby ruby-on-rails-5 jsonb ransack

如何正确搜索 JSONB 列,将键和值作为参数传递。

关注此维基 https://github.com/activerecord-hackery/ransack/wiki/PostgreSQL-JSONB-searches .

除了底部之外,一切都对我有用,其中表示我们也可以通过传递键值进行搜索。

ransacker :within_json do |parent|
   Arel.sql("contacts.json_data::text") 
end

例如:Contact.all.ransack("within_json_cont"=> '{"key": "value"}') 但可以让它工作,对我来说没有结果。

最佳答案

删除花括号,因为它代表完整的哈希值。您需要获取包含特定键和值的 json 数据。

ransacker :within_json do |parent|
   Arel.sql("contacts.json_data::text") 
end

如果您使用 PostgreSQL,这部分是正确的。如果你使用MySQL,你可以这样做

ransacker :within_json do |parent|
   Arel.sql("contacts.json_data") 
end

这些数据以文本形式存储在数据库中,因此我们只需要搜索确切的文本即可。这可以通过

来完成
Contact.ransack("within_json_cont" => '"key":"value"')

如果你想搜索某个键的特定值,你可以创建一个掠夺者

  ransacker :key do |parent|
    Arel::Nodes::InfixOperation.new('->>', parent.table[:json_data],
                                    Arel::Nodes.build_quoted('$.key'))
  end

希望这有帮助。祝你好运

关于ruby-on-rails - Rails ransack gem 以键值对作为参数搜索 jsonb 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59942681/

相关文章:

ruby-on-rails - 将HTTP 2与AWS Elastic beantalk一起使用的最佳方法是什么

ruby-on-rails - 序列化时无法将空数组保存到数据库

mysql - rails MySql :Empty result in development mode

ruby-on-rails - time created_at + 1 周

ruby - 如何使用 ruby​​ 将大文件从客户端传输到服务器?

ruby-on-rails - 错误 : Exhausted all sources trying to fetch version 'latest' of RVM

ruby-on-rails - RSpec 测试未通过 : Expected response to be a <3XX: redirect>,,但为 <200:OK>

ios - 将 Ruby 代码从苹果文档 (iPhoneOTAConfiguration) 转换为 Java

ruby-on-rails - Rails 5 - 供应商 Assets 未加载到生产中(仅字体)

ruby-on-rails - Rails 5 params 对象具有空数组作为值被删除