保存常量查询 - Rails

时间:2012-12-24 04:16:45

标签: ruby-on-rails

假设我有一个产品型号和一个类别模型。

我想在首页上显示每个类别的热门产品。

我正在做这样的事情(简化):

# 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的方法。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

这样效率更高:

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

有些观点:

  1. 没有理由从类别表
  2. 获得除类别ID以外的任何内容
  3. 当您所做的只是使用category_id过滤产品时,没有必要加入类别表
  4. 如果不经常更改,您可以使用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 参数,但其他缓存提供程序可能不支持。