0

Products モデルと Categories モデルがあるとします。

トップページにカテゴリごとに上位の製品を表示したいと考えています。

私はこのようなことをしています(簡略化):

# Using closure tree gem for category hierarchy
# This returns a list of category IDs, somewhat expensive call if 
# there are a lot of categories nested within "toys"
@categories = Category.find('toys').self_and_descendants
@top_toys = Products.joins(:categories).where(:categories => {:id => category_ids}}).limit(5)

これが最も効率的な方法かどうかはわかりません。比較的一定のカテゴリ ID を格納する方法があるようです。

何か案は?ありがとう!

4

1 に答える 1

1

これはもう少し効率的です:

@category_ids = Category.select(:id).find('toys').self_and_descendants.collect(&:id)
@top_toys = Products.where(:category_id => @category_ids).limit(5)

いくつかのポイント:

  1. カテゴリ テーブルからカテゴリ ID 以外を取得する理由はありません
  2. category_id を使用して製品をフィルタリングするだけの場合、category テーブルに参加しても意味がありません

これが頻繁に変更されない場合は、Rails キャッシュを使用して @categories の結果を保存できます。それはこのように見えるかもしれません

class Category < ActiveRecord::Base

  def self.ids_for_type(category_type) 
    Rails.cache.fetch "category:#{category_type}", :expires_in => 1.day do
      select(:id).find(category_type).self_and_descendants.collect(&:id)
    end
  end

  ..
end

その後

@top_toys = Products.where(:category_id => Category.ids_for_type('toys')).limit(5)

注:取得するexpires_inパラメータは、memcache キャッシュ クライアントでサポートされていますが、おそらく他のキャッシュ プロバイダではサポートされていません。

于 2012-12-24T06:20:26.157 に答える