Select 来自数据库的特定 JSON 节点使用 Rails/AREL?

Select from database a specific JSON node using Rails/AREL?

假设我有一个名为 books 的 table,它有一个名为 miscjson 类型的列,其中保存了一些杂项数据。使用 Rails/AREL 我只想从所有书籍中提取 id 和页数 (num_pages)。

psql 中,我可以执行以下操作:

SELECT id, misc->'num_pages' FROM books ;
  id   |   ?column?    
-------+---------------
 23562 | "220"
 22188 | "355"

(注意:上述查询使用 --> 产生的结果与使用 -> 产生的结果相同)。

我预计这会起作用:

pry> Book.select("id, misc->>'num_pages'")
  Book Load(1.7ms)  SELECT  id, etc-->'num_pages' FROM "books"
  Book Load(1.5ms)  SELECT  id, etc-->'num_pages' FROM "books"
=> #<Book::ActiveRecord_Relation:0x3ff7e934d8f4>

pry> Book.select("id, misc->'num_pages'")
  Book Load(1.1ms)  SELECT  id, etc->'num_pages' FROM "books"
=> [#<Book:0x00007fefd3c11a68 id: 23562>, #<Book:0x00007fefd3c116a8 id: 22188>]

...当我删除 ->'num_pages' 部分时,它 returns 整个 misc 字段(所以我知道它 almost 工作):

pry> Book.select("id, misc")
  Book Load(0.9ms)  SELECT  id, etc FROM "books"
=> [#<Book:0x00007fefe4e99fb8
  id: 23562,
  etc:
   {"num_pages"=>"220",
...

我无法使用 .select 完成它,但 .pluck 可以以这种形式工作:

Book.pluck("id", "misc -> 'num_pages'")
  => [[23562, "220"], [22188,"355"]]

但是,这会产生弃用警告:

DEPRECATION WARNING: Dangerous query method (method whose arguments are used 
as raw SQL) called with non-attribute argument(s): "misc->'num_pages'". 
Non-attribute arguments will be disallowed in Rails 6.0. This method should
not be called with user-provided values, such as request parameters or model
attributes. Known-safe values can be passed by wrapping them in Arel.sql().

所以按照建议使用Arel.sql()

Book.pluck("id", Arel.sql("misc -> 'num_pages'"))
  => [[23562, "220"], [22188,"355"]]