【问题标题】:Casting JSON with ActiveRecord raw query使用 ActiveRecord 原始查询转换 JSON
【发布时间】:2017-12-17 13:06:47
【问题描述】:

是否可以让 ActiveRecord 以某种方式从原始查询中转换 JSON 值?

这是一个示例,我希望将 {"x": 1} 结果转换为哈希值,但我得到的是字符串:

irb(main):017:0> ActiveRecord::Base.connection.select_value(%{SELECT '{"x": 1}'::json})
(0.2ms)  SELECT '{"x": 1}'::json
=> "{\"x\": 1}"

irb(main):018:0> ActiveRecord::Base.connection.select_value(%{SELECT '{"x": 1}'::json}).class
(0.2ms)  SELECT '{"x": 1}'::json
=> String

请不要推荐JSON.parse('{"x": 1}')。我需要 ActiveRecord 方法。

【问题讨论】:

  • “我需要 ActiveRecord 方法”是什么意思?你想对结果做什么?你有模特吗?真正的查询是什么样的?
  • 你试过 ActiveModel 序列化器 JSON 吗?你可以在这里找到更多信息api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html
  • @muistooshort 我只需要 ActiveRecord 级别的东西,也许可以实现基于 PostgreSQL OID 或类似的类型转换。我想让 AR 自动实现。

标签: ruby-on-rails json ruby activerecord rails-activerecord


【解决方案1】:

低级数据库接口往往有点受限,因为每个人都认为您使用的是 ORM。但是,您可以欺骗 ActiveRecord 为您完成工作,因为大多数数据库处理逻辑都在 ActiveRecord 本身中。

ActiveRecord 查询通常使用查询结果而不是模型或表必须说明的内容,因此您可以说出以下内容:

Model.select('2*3 as six')

并且您返回的 Model 实例将具有 six 属性。

这个诡计也适用于find_by_sql:

> Model.find_by_sql(%q{select '{"a":11}'::jsonb as pancakes}).first.pancakes
=> {"a"=>11} 
> Model.find_by_sql(%q{select '{"a":11}'::jsonb as pancakes}).first.pancakes.class
=> Hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多