[使用Rails / AREL从数据库中选择特定的JSON节点?

问题描述 投票:0回答:1

假设我有一个名为books的表,并且它具有一个名为jsonmisc类型的列,其中已保存了一些其他数据。我想使用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'部分时,它将返回整个misc字段(所以我知道它正在[[几乎工作):

pry> Book.select("id, misc") Book Load(0.9ms) SELECT id, etc FROM "books" => [#<Book:0x00007fefe4e99fb8 id: 23562, etc: {"num_pages"=>"220", ...
ruby-on-rails json postgresql arel
1个回答
1
投票
我无法使用.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"]]

© www.soinside.com 2019 - 2024. All rights reserved.