【问题标题】:Select from database a specific JSON node using Rails/AREL?使用 Rails/AREL 从数据库中选择特定的 JSON 节点?
【发布时间】:2020-08-04 18:23:16
【问题描述】:

假设我有一个名为books 的表,它有一个名为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>]

...当我删除 -&gt;'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",
...

【问题讨论】:

  • 当你运行你的两个 Rails AREL 时,你得到了什么?错误信息?没有?
  • 我更新了问题给你看:)
  • 我的回答有用吗?我不确定为什么 pluck 对 select 有效。
  • 它有效 - 谢谢。我添加了我看到的弃用警告以及它方便地建议的解决方案。我仍然很想看到select 解决了这个问题。

标签: ruby-on-rails json postgresql arel


【解决方案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"]]

【讨论】:

  • @user664833,您使用的是什么版本。我在 Rails 5.1.7 上
  • 我在Rails 5.2.3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多