我正在尝试构建一个东西(最终是一个gem,但现在是一个应用程序),其工作方式如下。
例如,假设DB记录是狗的品种。有一个Dog父类和每个品种的子类。实际的品种直到运行时才知道。
当服务器启动时,它将从数据库加载记录,并根据记录实例化类的实例,例如,我可能有两只比格犬和一只贵宾犬。当有人访问服务器时,他们可能想要访问其中一些狗的实例。
为什么不在运行时创建实例?在我的情况下,“狗”基本上是保存算法和数据的类。算法不会改变,数据很少更改(按天计算),但算法本身的执行(使用数据和一些传递的动态数据,例如时间戳)将被多次访问。
每次请求都重新创建对象并加载数据是愚蠢的,因为请求不会改变对象的状态。我将每秒创建和销毁多个对象,而我可以重复使用同一个对象。
将其保留在会话中没有意义,因为想要贵宾犬的人不应该在她的会话对象中具有比格犬的信息;这是无关紧要的(也不可扩展)。
我该如何在内存中持久化这些对象?我基本上想要一个查找表来保存这些实例。在Java中,我会创建一个单例,其中包含某种类型的哈希表或数组,它位于内存中。在Rails中,我尝试通过在lib文件夹中创建一个单例类来实现这一点。我认为——可能我没有理解正确——当会话消失时,实例(单例的事实是无关紧要的)丢失了。我发现最接近的答案是http://www.ruby-forum.com/topic/129372,它基本上将所有内容放入类字段和方法中。但在某种程度上,这似乎不正确。
谢谢!
补充:我来自Java。在Java中,我只需创建一个对象,它就会坐落在堆上或者可能在JNDI树中,随着HTTP请求的到来,它们将被一个servlet或EJB处理,或者一些每个请求的项可以访问持久化对象。我似乎找不到在Rails中的等效方法。