Ruby on rails 保存常量查询-Rails

Ruby on rails 保存常量查询-Rails,ruby-on-rails,Ruby On Rails,假设我有一个产品模型和一个类别模型 我想在头版上按类别显示顶级产品 我正在做这样的事情(简化): 我不确定这是否是最有效的方法。似乎有一种方法可以存储那些相对恒定的类别ID 有什么想法吗?谢谢 这会更有效率: @category_ids = Category.select(:id).find('toys').self_and_descendants.collect(&:id) @top_toys = Products.where(:category_id => @category_

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

我想在头版上按类别显示顶级产品

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

我不确定这是否是最有效的方法。似乎有一种方法可以存储那些相对恒定的类别ID


有什么想法吗?谢谢

这会更有效率:

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

  • 没有理由从category表中获取除category ID之外的任何内容
  • 当您所做的只是使用category_id筛选产品时,加入categories表是没有意义的
  • 如果@categories结果不经常更改,那么可以使用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
    

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

    还应添加
    Rails.cache.clear“category:#{category_type}”
    在Category#update and Category#Create中,我使用的是一个联接表,因为它们有一个HABTM associationFor HABTM,您需要将联接放回,但是第一个获取类别ID的查询仍然会稍微快一点,因为只获取ID,而不是整个类别定义。我只是快速查看了闭包树gem代码。这里最大的成功是缓存第一次调用的类别ID,避免从树结构中提取它们。
    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)