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