Let's say I have an app that handles a TODO list. The list has finished and unfinished items. Now I want to add two virtual attributes to the list object; the count of finished and unfinished items in the list. I also need these to be displayed in the json output.
I have two methods in my model which fetches the unfinished/finished items:
def unfinished_items    self.items.where("status = ?", false)  end   def finished_items    self.items.where("status = ?", true)  end   So, how can I get the count of these two methods in my json output?
I'm using Rails 3.1
The serialization of objects in Rails has two steps:
as_json is called to convert the object to a simplified Hash.to_json is called on the as_json return value to get the final JSON string.You generally want to leave to_json alone so all you need to do is add your own as_json implementation sort of like this:
def as_json(options = { })   # just in case someone says as_json(nil) and bypasses   # our default...   super((options || { }).merge({     :methods => [:finished_items, :unfinished_items]   })) end   You could also do it like this:
def as_json(options = { })   h = super(options)   h[:finished]   = finished_items   h[:unfinished] = unfinished_items   h end   if you wanted to use different names for the method-backed values.
If you care about XML and JSON, have a look at serializable_hash.
With Rails 4, you can do the following -
render json: @my_object.to_json(:methods => [:finished_items, :unfinished_items])   Hope this helps somebody who is on the later / latest version
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With