我想让我的方法更有效率。 我的方法需要很多时间来响应。 因此,请编辑我的代码以获得更有效的响应。如果您使此方法更有效率,我非常感谢您。 而且您是 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