Add virtual attribute to json output

json, ruby-on-rails

Solution

The serialization of objects in Rails has two steps:

- First, `as_json` is called to convert the object to a simplified Hash.

- Then, `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`.

Problem

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

Original source