操作是具有大型JSON对象的响应,可以将其分为动态和静态部分。
render :json => {:dynamic => someting, :static => huge_static_object}
静态部分的评估花费的时间太长,所以它被缓存了。
huge_static_object = Rails.cache.fetch(key) do
do_something
end
render :json => {:dynamic => something, :static => huge_static_object}
现在rails反序列化每次从缓存+序列化读取到JSON。因此,让我们将结果存储在缓存中作为JSON。
huge_static_object = Rails.cache.fetch(key) do
do_something.to_json
end
render :json => {:dynamic => something, :static => huge_static_object}
现在我们在渲染上进行序列化时遇到问题,因为动态部分需要序列化,但静态部分已经是序列化字符串。所以添加一个简单的代理类。
class JsonStringProxy
def initialize arg
@object = arg
end
def to_json(*args)
self
end
def as_json(*args)
self
end
def encode_json(*args)
@object
end
def to_s
@object
end
end
huge_static_object = Rails.cache.fetch(key) do
do_something.to_json
end
render :json => {:dynamic => something, :static => JsonStringProxy.new(huge_static_object)}
现在一切正常,但可能更容易做到这一点?