2010-09-22 39 views
2

假设我有一个系统表'categories'和2个固定记录。用户将不被允许删除这2个,但可能希望添加他们自己的扩展名单。我需要在某些时候拔出“花园”类别,例如在创建花园项目时。Rails:如何缓存系统表数据

返回花园实例的类属性读取器可以完成这项工作,但我想知道如何通过缓存提高这一点?

我相信memoization只会在每个进程中工作,这在这里几乎毫无意义。我希望将其设置一次(可能是第一次访问它或在应用程序启动时),并保留在缓存中供将来使用。

示例设置:

class Project < ActiveRecord::Base 
    belongs_to :category 
end 

class Category < SystemTable 
    cattr_reader :garden 
    def self.garden 
    @@garden ||= self.find_by_name('garden') 
    end 
end 

回答

2

如何如下所示的方法,在加载Category类时,将一次检索花园比如:

class Category < SystemTable 
    GARDEN = self.find_by_name('garden') 
end 

现在,只要您需要的园林类,你可以使用Category::GARDEN

1

互锁,这与memcached的工作的插件,会自动缓存由直“发现”号使用的任何情况。同样,您可以绕过互锁并手动缓存memcached中的对象。类级别的变量是一个肮脏和潜在的错误导致的解决方案(我甚至不知道它是否工作)。有大量关于在网络上安装和使用memcached/memcache-client的信息。

+0

我必须说,我不觉得这种方法特别舒服。我需要数据库中的类别,我不想依赖知道记录的ID。你有改进方法的想法吗?我会看看Interlock/memcached。感谢您的答复。 – tsdbrown 2010-09-22 10:19:07

+0

我刚刚看了你的帖子:http://webcrisps.wordpress.com/2010/01/07/dynamically-add-class-methods-in-rails/自写之后,你仍然会推荐它,因为这似乎完全适应这种情况!?我只需要添加一个条件来只取出非基于客户的记录。 – tsdbrown 2010-09-22 10:34:29

+0

不是真的 - 我的方法创建了一个方便的方法,但它不会缓存结果,因此不会添加任何性能。这只是为了方便,也就是为了节省我在我的代码中输入一些内容。 – 2010-09-23 10:27:48