我想在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