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

时间:2011-07-10 02:15:51

标签: ruby-on-rails ruby-on-rails-3 activerecord orm model

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


修改

我想要完成的只是:

  1. 从数据库中获取现有记录。
  2. 将记录的“哈希”输出存储到redis或其他一些内存存储中。
  3. 下次获取该记录时,首先获取缓存的商店,如果未找到,则转到步骤1.
  4. 如果存在缓存命中,则将所有缓存的属性加载到该模型中,并使该模型实例的行为就像是从具有有限列的数据库中获取的模型一样。
  5. 这就是我被困住的地方,我一直在做的是创建一个Model.new对象并手动设置每个参数。这有效,但它将实例化的模型对象视为新记录。在ActiveRecord中必须有一个中间子程序来进行属性设置。

2 个答案:

答案 0 :(得分:1)

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

  1. 创建一个新的模型类,扩展我希望缓存到内存中的模型类。

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

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

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

  5. 这是我的代码:

    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
    

答案 1 :(得分:0)

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

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