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 过滤产品时,加入类别表是没有意义的

如果不经常更改,您可以使用 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)

注意:memcache缓存客户端支持expires_in参数,但其他缓存提供者可能不支持。

于 2012-12-24T06:20:26.157 回答