2

私は 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

ループ内のすべてのフェッチは、データベースでヒットします。理想的には、すべての曲に対して単一のクエリを使用してすべてを実行できるのに、各曲のループで発生するクエリが多すぎると感じています。これが物事を処理する標準的なレールの方法なのか、それとも完全に悪いコードなのか、誰かが示唆できますか?

すべての助けをありがとう。

4

2 に答える 2

1

DB クエリの数を減らすために、ActiveRecord の includesメソッドを使用できます。例えば:

 @toplistsongs =  Song.select(INDEX_COLUMNS).order("popularity_total,created_at     DESC").limit(10).includes(:tags, { :songs => :artists }, :urls, :likers)

これにより、top メソッド全体に対して 5 つのクエリが生成され、提示する曲の数には依存しません。つまり、クエリの数は一定です。

これを機能させるには、ActiveRecord 関連付けを使用する必要があります。get_song_artist協会が作成したものではないと思われる方法を使用していることがわかります。

ActiveRecord アソシエーションで関係を形成するには、has_many、has_one、beels_to 演算子を使用する必要があります。

于 2012-09-20T07:19:05.690 に答える
0

これは簡単な返信です。特に何かについて混乱している場合はお知らせください。

モデル定義は次のようにする必要があります

class Artist<AR::Base
    has_many :albums
end

class Album<AR::Base
    belongs_to :artist
    has_many :songs
end

class Song<AR::Base
    belongs_to :album
end

検索行は次のようになります

@toplistsongs = Song.order("popularity_total, created_at").limit(10).includes(:tags, { :songs => :artists }, :urls, :likers)

popularity_totalあなたの分野に基づいて上位 10 曲を返す必要があります。

インクルード部分についてはErez Rabihに感謝します

  • aは のsong.albumを返す必要AlbumがありSongます。
  • aは のsong.album.artistを返す必要ArtistがありSongます。

これらの関係は、熱心な読み込みによって読み込むことができます。リンクに従ってください。

と との関係があると仮定しtagsますurls

于 2012-09-20T07:18:43.387 に答える