【问题标题】:Rails ransack gem to search jsonb column with key value pair as parameterRails ransack gem 以键值对作为参数搜索 jsonb 列
【发布时间】:2020-05-13 12:14:41
【问题描述】:

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

关注此 wiki 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"}') 但是可以让它工作,对我来说没有结果。

【问题讨论】:

  • 你在model contact.rb中添加了需要的代码吗?
  • 你的意思是:ransacker :within_json do |parent| Arel.sql("contacts.json_data::text") end ..yes

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


【解决方案1】:

删除花括号,因为它代表完整的哈希。您需要获取包含特定键和值的 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

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

希望这会有所帮助。祝你好运

【讨论】:

  • 这对于大型数据集来说看起来非常昂贵:它是否利用了 postgres 索引?
  • 抱歉回复晚了。是的,它很贵。首先,您不应该在 jsonb 列中存储大数据。我通常对 jsonb 列所做的事情是存储我们通常不必从应用程序界面搜索的设置或数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多