如何使此方法更高效 Rails 3.



我想让我的方法更有效率。 我的方法需要很多时间来响应。 因此,请编辑我的代码以获得更有效的响应。如果您使此方法更有效率,我非常感谢您。 而且您是 Ruby on Rails 的大师,那么如果您可以使用连接制作此方法,那么它对我来说是多么糟糕的完整方法。谢谢

 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
                    }
                ]
            }
        ]
    }
]
  • 第一步是将逻辑移动到模型,这样控制器将变得更薄

在您的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

相关内容

  • 没有找到相关文章

最新更新