这是我编写的用于跟踪Rails应用程序中的后台活动的类。
我的问题是status
字段已正确更新,但logs
字段未正确更新。知道为什么吗?
ps1:我可以在日志中看到tmp_logs
包含我想要的数据,即从根目录找到的html文件列表)
ps2:此代码通过rake
和delayed_job
gem。
class MaintenanceOperation < ActiveRecord::Base
attr_accessible :logs, :status, :operation
def track_object_elements_in_html
status = "started"
tmp_logs = logs
self.save
begin
nb_files = 0
html_files = File.join(my_root, "**", "*.{html,htm,HTML,HTM}")
Dir.glob(html_files).each do |file|
nb_files += 1
tmp_logs << file << "\n"
logger.debug tmp_logs
end
tmp_logs << "Found #{nb_files} files." << "\n"
self.logs = tmp_logs
self.status = "done"
rescue Exception => e
logger.error "Finished performing maintenance operation with error"
logger.error e.message
e.backtrace.each { |line| logger.error line }
logger.error "Flagging as error"
self.status = "error"
end
self.save
end
end
编辑:
在更改logs
后保存时,我可以在日志中看到空事务。
2013-02-18 19:15:28.981 [meh] (0.1ms) begin transaction (pid:80725)
2013-02-18 19:15:28.982 [meh] (0.0ms) commit transaction (pid:80725)
答案 0 :(得分:0)
我认为你被活跃的唱片改变追踪所困扰。简而言之,当您调用save Active Record时,只会更新它认为您已更新的列。特别是,如果您在适当的位置修改属性(例如,在其上调用gsub!或&lt;&lt;),则Active Record不会发现该属性。
你在做什么
self.logs = tmp_logs
但是,tmp_logs
之前设置为logs
,因此self.logs
和tmp_logs
是同一个对象。在您执行赋值时,Active Record会比较self.logs和tmp_logs,看到它们是同一个对象,因此不会将列标记为已更改。
您可以更改代码,以便Active Record认为您正在为logs列分配一个新值(例如将tmp_logs设置为self.logs.dup),或者您可以调用logs_will_change!
来告诉Active Record您已经修改了该属性,并且在下次调用save时应该更新该属性。