【问题标题】:non-DB attr_accessor attribute persistence in RailsRails 中的非 DB attr_accessor 属性持久性
【发布时间】:2008-10-03 15:02:54
【问题描述】:
我有一个应用程序,其中 attr_accessor 用于保存将传递给 rake 任务的模型的临时数据。看到这些属性没有数据库字段并且它们不是从数据库数据中计算出来的,attr_accessor 数据是否会持续存在并可供 rake 任务使用?如果我需要重新启动服务器会发生什么 - 如果数据没有保存到数据库中,数据会丢失吗?或者要实现这一点,我需要保存到临时文件还是数据库字段?
【问题讨论】:
标签:
ruby-on-rails
ruby
activerecord
【解决方案1】:
我假设您是在询问存储在源自 Web 请求的 ActiveRecord 对象的属性中的数据在通过 Rake 任务访问它们时是否可用?
没有。他们不会。该数据甚至无法用于下一个 Web 请求。如果您两次加载相同的记录,这些数据甚至都不存在。
class Thing < ActiveRecord::Base
attr_accessor :data
end
#try this in script/console
thing = Thing.find(:first)
thing.data = "Something"
thing = Thing.find(:first)
puts thing.data
-> nil
【解决方案2】:
这取决于您将数据传递给 rake 任务的方式以及原因。如果您尝试对请求进行带外工作,这意味着不要让用户等到完成,我建议您在此处查看 Ryan 的出色截屏视频http://railscasts.com/episodes/128-starling-and-workling 以了解作业队列。
如果您必须像这样使用 rake 其他一些奇特的原因,您可以将数据作为命令行参数传递。这取决于您需要传递多少数据及其复杂性,因为它可能很快就会失控。
使用上面丹尼尔的例子:
thing = Thing.find(:first)
thing.data = "某事"
rake myraketask thing_id=#{thing.id} data=#{thing.data}
【解决方案3】:
当然会丢失,你认为数据死后会去哪里?到一个可以随时返回的数据 h(e)aven?
我想知道你需要这些数据来做什么,但最终的答案可能是数据属于数据库,除非它是大的二进制数据,例如图像,你应该将它保存在文件系统中。