对rawSQL查询结果使用ActiveModelSerializers



我想在Rails中使用ActiveModelSerializers来处理rawSQL查询的结果。我找不到做这件事的方法。

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

但是这些都不能序列化。

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

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

相关内容

  • 没有找到相关文章

最新更新