【问题标题】:Existing Rails model without fetching it from the database现有的 Rails 模型而不从数据库中获取它
【发布时间】:2011-07-10 02:15:51
【问题描述】:

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


编辑

我想要完成的只是这个:

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

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

【问题讨论】:

  • 你想完成什么?
  • 活动记录不是已经做了吗?
  • rails2 有缓存资金(使用 memcache)github.com/nkallen/cache-money。也许有人会建议一些与rails3兼容的模拟。

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


【解决方案1】:

我通过执行以下操作解决了问题。

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

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

  3. 新建一个initialize方法,在里面调用super方法,然后让那个方法的一个参数允许一个hash变量包含父类的所有属性。

  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

【讨论】:

    【解决方案2】:

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

    否则,请查看 ActiveRecord::Base#instantiate 以了解它是如何正常完成的。您将不得不通过一堆 Rails 堆栈进行跟踪,但这就是您尝试这种骇客所得到的!

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多