【问题标题】:Existing Rails model without fetching it from the database现有的 Rails 模型而不从数据库中获取它
【发布时间】:2011-07-10 02:15:51
【问题描述】:
有谁知道是否可以创建模型实例并应用 ID 和任何其他属性而无需从数据库中加载它?我试过这样做,但没有从数据库中获取关联:(有什么想法吗?
编辑
我想要完成的只是这个:
- 从数据库中获取现有记录。
- 将记录的“散列”输出存储到 redis 或其他内存存储中。
- 下次获取该记录时,先获取缓存的存储,如果未找到,则转到步骤 1。
- 如果缓存命中,则将所有缓存的属性加载到该模型中,并使该模型实例的行为与从数据库中获取的具有有限列集的模型一样。
这是我卡住的地方,我一直在做的是创建一个 Model.new 对象并手动设置每个参数。这可行,但它将实例化的模型对象视为新记录。 ActiveRecord 中必须有一个中间子程序来进行属性设置。
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-3
activerecord
orm
model
【解决方案1】:
我通过执行以下操作解决了问题。
创建一个新的模型类,扩展我想要缓存到内存中的模型类。
将新类的table_name设置为与父类相同。
新建一个initialize方法,在里面调用super方法,然后让那个方法的一个参数允许一个hash变量包含父类的所有属性。
重载方法 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 堆栈进行跟踪,但这就是您尝试这种骇客所得到的!