Rails中的非DB attr_accessor属性持久性

时间:2020-03-06 15:04:47  来源:igfitidea点击:

我有一个应用程序,其中使用attr_accessor来保存将传递给rake任务的模型的临时数据。看到没有用于这些属性的数据库字段,并且没有从数据库数据中计算出这些属性,attr_accessor数据是否将持久存在并且可用于rake任务?如果我需要重新启动服务器会发生什么情况,那么数据是否会丢失然后又没有保存到数据库中呢?还是要实现这一点,我是否需要保存到临时文件或者数据库字段?

解决方案

当然会丢失,我们认为数据丢失后会流向何处?总是可以从哪里返回到数据h(e)aven?

我想知道我们需要什么数据,但最终的答案可能是数据属于db,除非它是大型二进制数据(例如图像),我们应该将其保存在文件系统中。

我假设我们要问的是,通过Rake任务访问来自Web请求的ActiveRecord对象的属性中存储的数据是否可用?

不,他们不会。该数据甚至无法用于下一个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

这取决于我们如何将数据传递给rake任务以及原因。如果我们尝试根据请求进行带外工作,这意味着不要让用户等到完成后,我建议在此处查看Ryan出色的截屏视频http://railscasts.com/episodes/128-starling-工作以了解作业队列。

如果出于其他一些特殊原因,则必须使用rake这样的数据,则可以将数据作为命令行参数传递。这取决于我们需要传递多少数据及其复杂性,因为它们可能很快就会失控。

从上面使用Daniel的示例:

事= Thing.find(:first)
Thing.data ="东西"

rake myraketask Thing_id =#{thing.id} data = ## {thing.data}