假设我有一个产品型号和一个类别模型。
我想在首页上显示每个类别的热门产品。
我正在做这样的事情(简化):
# 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的方法。
有什么想法吗?谢谢!
答案 0 :(得分:1)
这样效率更高:
@category_ids = Category.select(:id).find('toys').self_and_descendants.collect(&:id)
@top_toys = Products.where(:category_id => @category_ids).limit(5)
有些观点:
如果不经常更改,您可以使用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缓存客户端支持 fetch 的 expires_in 参数,但其他缓存提供程序可能不支持。