现有的Rails模型,无需从数据库中获取它

有没有人知道是否可以创建模型实例并应用ID和任何其他属性而无需从数据库加载它? 我尝试这样做,但没有从数据库中获取关联:(任何想法?


编辑

我想要完成的只是这个:

  1. 从数据库中获取现有记录。
  2. 将记录的“哈希”输出存储到redis或其他一些内存存储中。
  3. 下次获取该记录时,首先获取缓存的存储,如果未找到,则转到步骤1。
  4. 如果存在缓存命中,则将所有缓存的属性加载到该模型中,并使该模型实例的行为就像它是从具有有限列的数据库中获取的模型一样。

这就是我被卡住的地方,我一直在做的是创建一个Model.new对象并手动设置每个参数。 这有效,但它将实例化的模型对象视为新记录。 ActiveRecord中必须有一个中间子程序来执行属性设置。

我通过以下方式解决了这个问题。

  1. 创建一个新的模型类,它扩展了我想要缓存到内存中的模型类。

  2. 将新类的table_name设置为与父类相同的table_name。

  3. 创建一个新的initialize方法,在其中调用super方法,然后允许该方法的参数允许包含父类的所有属性的哈希变量。

  4. 重载方法new_record? 并将其设置为false以使关联起作用。

这是我的代码:

 class Session < User self.table_name = 'users' METHODS = [:id, :username] # all the columns that you wish to have in the memory hash METHODS.each do |method| attr_accessor method end def initialize(data) super({}) if data.is_a?(User) user = data data = {} METHODS.each do |key| data[key] = user.send(key) end else data = JSON.parse(data) end data.each do |key,value| key = key.to_s self.send(key+'=',value) end end def new_record? false end end 

memcached gem允许您将任意Ruby对象推入其中。 如果你正在使用它,这应该透明地为你处理。

否则,请查看ActiveRecord :: Base #instantiate以了解它是如何正常完成的。 你将不得不追踪一堆铁轨堆栈,但这就是你尝试这样的hackery所得到的!