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 theas_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
.