假设我有一个名为books
的表,并且它具有一个名为json
的misc
类型的列,其中已保存了一些其他数据。我想使用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",
...
.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"]]