如何让这种方法更高效Rails 3?

时间:2015-01-02 11:06:30

标签: ruby-on-rails ruby json ruby-on-rails-3 rubyzip

我想让我的方法更有效率。我的方法花了很多时间作为回应。所以请编辑我的代码以获得更有效的响应。如果你使这个方法更有效,我非常感谢你。如果你能用连接制作这个方法,那么你就是在轨道上的红宝石中的主人,那么对我来说,这是一个更好的方法。 谢谢

 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

,输出

[
    {
        "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
                    }
                ]
            }
        ]
    }
]

1 个答案:

答案 0 :(得分:0)

  • 第一步是将你的逻辑转移到模型,这样你的控制器就会变得更加苗条

Tv模型中

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

现在你可以像

一样使用
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