为什么Ruby on Rails没有保存我的数据?

时间:2013-02-18 18:06:07

标签: ruby-on-rails delayed-job rails-activerecord

这是我编写的用于跟踪Rails应用程序中的后台活动的类。

我的问题是status字段已正确更新,但logs字段未正确更新。知道为什么吗?

ps1:我可以在日志中看到tmp_logs包含我想要的数据,即从根目录找到的html文件列表)

ps2:此代码通过rakedelayed_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)

1 个答案:

答案 0 :(得分:0)

我认为你被活跃的唱片改变追踪所困扰。简而言之,当您调用save Active Record时,只会更新它认为您已更新的列。特别是,如果您在适当的位置修改属性(例如,在其上调用gsub!或&lt;&lt;),则Active Record不会发现该属性。

你在做什么

self.logs = tmp_logs

但是,tmp_logs之前设置为logs,因此self.logstmp_logs是同一个对象。在您执行赋值时,Active Record会比较self.logs和tmp_logs,看到它们是同一个对象,因此不会将列标记为已更改。

您可以更改代码,以便Active Record认为您正在为logs列分配一个新值(例如将tmp_logs设置为self.logs.dup),或者您可以调用logs_will_change!来告诉Active Record您已经修改了该属性,并且在下次调用save时应该更新该属性。