Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add virtual attribute to json output

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

like image 355
Linus Avatar asked Jul 31 '11 20:07

Linus


2 Answers

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.

like image 197
mu is too short Avatar answered Sep 24 '22 06:09

mu is too short


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

like image 25
Aswin Ramakrishnan Avatar answered Sep 23 '22 06:09

Aswin Ramakrishnan