Search code examples
ruby-on-railsrubyjsonjbuilder

How do I design a ruby equivalent objects for this json structure


I have a json structure that I need to build up based on url parameters provided by a client. Currently I've been building the json structure out using Jbuilder.encode but it's getting pretty hairy.

self.query = Jbuilder.encode do |json|
            json.query do
                json.filtered do
                    json.filter do
                        json.bool do
                            if(search_term && username)
                                json.array!(should) do
                                  ........

How can I build ruby objects so that I convert them into json based on how they are initialized?

Below is the full json structure I'd like to capture in ruby models/poros (plain old ruby objects).

{
    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "should": [
                        {
                            "query": {
                                "query_string": {
                                    "query": "tablet",
                                    "fields": [
                                        "standard_analyzed_name",
                                        "standard_analyzed_message"
                                    ]
                                }
                            }
                        },
                        {
                            "term": {
                                "username": "feedmatic"
                            }
                        }
                    ],
                    "must": [
                        {
                            "terms": {
                                "status_type": [
                                    "3",
                                    "4"
                                ]
                            }
                        },
                        {
                            "range": {
                                "created_on": {
                                    "gte": 20140712,
                                    "lte": 1405134711
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}

Solution

  • Hmm i'm not really sure about Poro's, but one thing I've seen is that when the structure starts to get hairy is to make a method that returns the hash representation of what you would like to show. Have you tried making a query method that returns a hash with that structure and then calling it in a jbuilder template? There's an .attributes method for rails that returns a hash with the attributes, but you would have to look into how to use it with a PORO and if it works for this purpose.