0

i want to make my method more efficient. my method take so much time in response. so please edit my code to get more efficient response.i am very thank full to you if you make this method more more efficient. and you are master in ruby on rails then if you can make this method with joins then what a wounder full method is it for me. thanks

 def all_shows_with_videos
    @arr = []
    tvs = Tv.all
    tvs.each do |tv|
      tv_tmp = {:name => tv.name, :id => tv.id}
      tv_tmp[:videos] = tv.videos
      tv_tmp[:seasons] = []
      season_tmp = {}
      tv.seasons.each do |season|
        season_tmp = {:name => season.name, :id => season.id}
        season_tmp[:videos] = season.videos
        season_tmp[:episodes] = []
        season.episodes.each do |episode|
        season_tmp[:episodes] << {:name => episode.name, :id => episode.id} if episode.videos?
        end
        tv_tmp[:seasons].push(season_tmp) if !season_tmp[:videos].blank? or !season_tmp[:episodes].blank?
      end

      @arr.push(tv_tmp) if !tv_tmp[:videos].blank? or !tv_tmp[:seasons].blank?
    end

    @arr = Kaminari.paginate_array(@arr).page(params[:page]).per(5)
    respond_to do |format|

      format.json {render :json => @arr}
    end
  end

and output is

[
    {
        "name": "Iron Man",
        "id": 95,
        "videos": [
            {
                "id": 1,
                "name": "Trailer 1",
                "site": "Youtube.com",
                "link": "Google.com",
                "quality": null,
                "video_type": null,
                "videoable_id": 95,
                "videoable_type": "Tv",
                "created_at": "2014-05-26T07:05:39+05:00",
                "video_source": null,
                "video_source_cd": null
            }
        ],
        "seasons": []
    },
    {
        "name": "How I Met Your Mother",
        "id": 100,
        "videos": [
            {
                "id": 13,
                "name": "Trailer 1",
                "site": null,
                "link": "google.com",
                "quality": "1020",
                "video_type": "Trailer",
                "videoable_id": 100,
                "videoable_type": "Tv",
                "created_at": "2014-06-09T10:05:03+05:00",
                "video_source": null,
                "video_source_cd": null
            }
        ],
        "seasons": []
    },
    {
        "name": "my tv",
        "id": 124,
        "videos": [
            {
                "id": 59,
                "name": "Trailer 1",
                "site": null,
                "link": "google.com",
                "quality": "1020",
                "video_type": "Trailer",
                "videoable_id": 124,
                "videoable_type": "Tv",
                "created_at": "2014-06-20T06:59:32+05:00",
                "video_source": null,
                "video_source_cd": null
            }
        ],
        "seasons": []
    },
    {
        "name": "Game of Thrones",
        "id": 151,
        "videos": [
            {
                "id": 129,
                "name": "",
                "site": null,
                "link": null,
                "quality": null,
                "video_type": "Season",
                "videoable_id": 151,
                "videoable_type": "Tv",
                "created_at": "2014-09-02T11:13:40+05:00",
                "video_source": null,
                "video_source_cd": null
            },
            {
                "id": 130,
                "name": "",
                "site": null,
                "link": "",
                "quality": null,
                "video_type": null,
                "videoable_id": 151,
                "videoable_type": "Tv",
                "created_at": "2014-09-02T11:13:40+05:00",
                "video_source": null,
                "video_source_cd": null
            },
            {
                "id": 131,
                "name": "",
                "site": null,
                "link": "",
                "quality": null,
                "video_type": null,
                "videoable_id": 151,
                "videoable_type": "Tv",
                "created_at": "2014-09-02T11:13:40+05:00",
                "video_source": null,
                "video_source_cd": null
            }
        ],
        "seasons": []
    },
    {
        "name": "Under the Dome",
        "id": 160,
        "videos": [],
        "seasons": [
            {
                "name": "Season Specials",
                "id": 267,
                "videos": [],
                "episodes": [
                    {
                        "name": "Inside Chester's Mill",
                        "id": 1112
                    }
                ]
            }
        ]
    }
]
Faysal
  • 47
  • 1
  • 9

1 Answers1

0
  • First step is to move your logic to model, that way your controller will get more skinnier

in your Tv model

def self.all_with_seasons_and_episodes
  tvs = includes(:videos, :seasons => [:videos, :episodes]).all
  # loads all tvs and all its videos and seasons, seasons videos and episodes
  tvs.map do |tv|
    {
      name:    tv.name,
      id:      tv.id,
      videos:  tv.videos,
      seasons: tv.map_seasons
    }
  end
end

private

def map_seasons
  seasons.map do |s|
    {
      id: s.id,
      name: s.name,
      videos: s.videos,
      episode: s.episodes.map {|e| {name: e.name, id: e.id} }
    }
  end
end

now you can use in like

def all_shows_with_videos
  arr = Tv.all_with_seasons_and_episodes
  @arr = Kaminari.paginate_array(arr).page(params[:page]).per(5)
  respond_to do |format|
    format.json {render :json => @arr}
  end
end
Nermin
  • 6,118
  • 13
  • 23
  • Started GET "/tv/all_shows_with_videos?api_key=moviedb-registration" for 127.0.0.1 at 2015-01-02 18:43:47 +0500 SyntaxError (/www/projects/movie_db/app/models/tv.rb:574: syntax error, unexpected keyword_end, expecting end-of-input): app/controllers/api/v1/tvs_controller.rb:1:in `' – Faysal Jan 02 '15 at 13:46
  • NoMethodError (private method `map_seasons' called for #): app/models/tv.rb:128:in `block in all_with_seasons_and_episodes' app/models/tv.rb:123:in `map' app/models/tv.rb:123:in `all_with_seasons_and_episodes' app/controllers/api/v1/tvs_controller.rb:454:in `all_shows_with_videos' – Faysal Jan 02 '15 at 13:54
  • there was missing `do` in method `map_seasons` I have edited post – Nermin Jan 02 '15 at 16:46