Select 来自数据库的特定 JSON 节点使用 Rails/AREL?
Select from database a specific JSON node using Rails/AREL?
假设我有一个名为 books
的 table,它有一个名为 misc
的 json
类型的列,其中保存了一些杂项数据。使用 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"]]
假设我有一个名为 books
的 table,它有一个名为 misc
的 json
类型的列,其中保存了一些杂项数据。使用 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"]]