Add virtual attribute to json output

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.

Leave a Comment