【问题标题】:Use ActiveModelSerializers with rawSQL query result将 ActiveModelSerializers 与 rawSQL 查询结果一起使用
【发布时间】:2021-12-12 19:15:36
【问题描述】:

我想在 Rails 中对 rawSQL 查询的结果使用 ActiveModelSerializers。 找不到办法。

sql = "SELECT * FROM table"
results = ActiveRecord::Base.connection.exec_query(sql)
options = { each_serializer: MySerializer }
output = ActiveModelSerializers::SerializableResource.new(results, options).as_json

我尝试了几种选择:

ActiveRecord::Base.connection.execute(sql)

PG::Result

ActiveRecord::Base.connection.exec_query(sql)

ActiveRecords::Result

但是这些都不能序列化。

【问题讨论】:

  • 你必须使用 AMS,它不再维护,其他 gem 将是例如blueprinterjsonapi-serializer

标签: ruby-on-rails postgresql active-model-serializers


【解决方案1】:

active_model_serializers 似乎不受支持,因此请考虑选择其他库。

无法使用您的自定义序列化程序对哈希进行序列化,因为它们没有read_attribute_for_serialization。所以我们可以用这样一个类包装results 的哈希:

class SerializableHash
  def initialize(original_hash)
    @original_hash = original_hash
  end

  def read_attribute_for_serialization(attribute)
    @original_hash[attribute]
  end
end

之后就可以序列化了:

sql = "SELECT * FROM table"
results = ActiveRecord::Base.connection.exec_query(sql).map do |item|
  SerializableHash.new(item)
end

options = { each_serializer: UserSerializer }
output = ActiveModelSerializers::SerializableResource.new(results, options).as_json

【讨论】:

    【解决方案2】:

    active_model_serializers 似乎不受支持,因此请考虑选择其他库。

    这不是最好的方法,不推荐猴子补丁

    无法使用您的自定义序列化程序对哈希进行序列化,因为它们没有read_attribute_for_serialization。所以解决这个问题最简单的方法就是给Hash类打猴子补丁:

    class Hash
      alias_method :read_attribute_for_serialization, :[]
    end
    

    然后它应该按预期工作:

    sql = "SELECT * FROM table"
    results = ActiveRecord::Base.connection.exec_query(sql)
    options = { each_serializer: UserSerializer }
    output = ActiveModelSerializers::SerializableResource.new(results, options).as_json
    
    

    【讨论】:

      猜你喜欢
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      相关资源
      最近更新 更多