私は RoR にあまり詳しくありませんが、同僚が私たちのアプリケーションの 1 つにこのコードを書きました。これは最適化されておらず、単純なタスクに対してクエリが多すぎると感じています。
3つのテーブルがあります。アーティスト、アルバム、曲。アーティストは複数のアルバムを持つことができます。アルバムには複数の曲を含めることができます。曲テーブルのフィールド Popular_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
ループ内のすべてのフェッチは、データベースでヒットします。理想的には、すべての曲に対して単一のクエリを使用してすべてを実行できるのに、各曲のループで発生するクエリが多すぎると感じています。これが物事を処理する標準的なレールの方法なのか、それとも完全に悪いコードなのか、誰かが示唆できますか?
すべての助けをありがとう。