Include Root Node for as_api_response
Opened this issue · 4 comments
Hello i currently working on the performance of my Rails 3.1 app and I added a lot of caching for some of the JSON i am rendering using acts_as_api
What works for me is this:
def around_api_response(api_template)
Rails.cache.fetch("api_response_#{self.class.to_s}_#{id}_#{api_template.to_s}", :expires_in => 1.hour) do
yield
end
end
The render statement in the Controller is similar to this:
render_for_api :template, :json => Item.for_user(@user.id)
I found this code in one of the other issues and it reduces the time for computing the response to a quater of the time without caching. Which was about 100-200ms in my case (about 98% of this time is used for view rendering).
So i tried to do some more optimization and I did something like this
@cache = Rails.cache.fetch("cache_data_for_user_#{ @user.id }") do
#Item.for_user(@user.id).as_api_response(:template) --> load time about 300ms
Item.for_user(@user.id).as_api_response(:template).to_json --> json in cache - load time 3ms! :)
end
My problem is that if i don't use the the render_for_api method the root element "Items" is not included. My object mapper on the client depends on this root element.
I tried
ActiveRecord::Base.include_root_in_json = true # i also think it should be true by default
but it didn't help
Can i force the inclusion of the root element in some way?
Thanks!
Why can't you use caches_action
at controller level?
caches_action performs not that good and causes bad performance with different action parameters
Does somebody have an idea how to solve this? it would allow me to decrease the rendering time of a api request by the factor 10.
Closing this for now. Please re-open if issue is still present.