【问题标题】:ActiveRecord, order objects based on JSON datatypeActiveRecord,基于 JSON 数据类型的排序对象
【发布时间】:2017-10-03 10:44:36
【问题描述】:

刚刚学习 JSON 数据类型,想知道 Rails 是否创建了一个很棒的快捷方式来进行排序。假设我有

object_a.payload = { "category_1" => 2, "category_2" => 1 }
object_b.payload = { "category_1" => 1 }
object_c.payload = { "category_2" => 3, "category_3" => 4 }

我想写这样的东西:

["category_1", "category_2", "category_3"].each do |cat|
  ordered_list = Object.where("payload->>'cat' != ?", nil).order(..on the values of the cat key..)
  puts "#{cat} = #{ordered_list}"
end

->
"category_1 = object_b, object_a"
"category_2 = object_a, object_c"
"category_3 = object_c"

2 个挑战:

  1. 如何在where 语句中插入cat

  2. 对于有效载荷中的给定键(如果存在),不知道从哪里开始根据哈希值进行排序

可以低效地做到这一点(设想 2 个语句,首先是 Object.select { |o| o.payload[cat].present? }),但希望通过 where 语句有效地做到这一点,希望只有一个语句

【问题讨论】:

  • 试试Object.where("payload ->> ? IS NOT NULL", cat) -- 但是.order() 似乎不支持绑定参数,但是手动插值确实是一个丑陋的解决方法。 PS:在 SQL 中你需要 f.ex。 ORDER BY payload -> 'category_1' 如果 payloadjsonb 列。对于json,您可能需要演员:ORDER BY CAST(payload ->> 'category_1' AS INTEGER)

标签: ruby-on-rails json ruby postgresql activerecord


【解决方案1】:

抱歉,我忘记了 sort_by 函数...所以在 @pozs 澄清如何过滤掉 nil 的基础上,答案是:

["category_1", "category_2", "category_3"].each do |cat|
  relevant_items = Object.where("payload ->> ? IS NOT NULL", cat)
  ordered_list = relevant_items.sort_by { |i| i.payload[cat] }
  puts "#{cat} = #{ordered_list}"
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    相关资源
    最近更新 更多