我对 RoR 不是很熟悉,但我的同事已经为我们的一个应用程序编写了这段代码,我觉得这对于一个简单的任务来说太不优化了,而且查询太多。
我们有 3 张桌子。艺术家、专辑和歌曲。艺术家可以有多个专辑。专辑可以有多首歌曲。我们正在尝试根据歌曲表中的字段 Popularity_total 输出前 10 首歌曲。然后还有其他表格可以捕获喜欢等。
def top
# a list of 10 most played songs in the past week
@toplistsongs = Song.select(INDEX_COLUMNS).order("popularity_total,created_at DESC").limit(10)
@toplistsongs.each do |song|
song['urls'] = song.get_song_urls
song['artist'] = song.get_song_artist
song['genre'] = song.tag_list
song['hearts'] = song.likers(User).count
song['like_status'] = ( current_user!=nil ? current_user.likes?(song) : false )
song['impressions'] = song.impressionist_count
song['albums'] = song.get_song_album
end
@w = {'top' =>
{
'song' => @toplistsongs
}
}
respond_with(@w)
end
循环内的每次 fetch 都会导致对 db 的命中。我有一种感觉,每首歌曲的循环中都会发生太多查询,而理想情况下,它们都可以使用对所有歌曲的单个查询来完成。任何人都可以建议这是处理事情的标准 Rails 方式还是这完全是糟糕的代码?
感谢所有的帮助。