2013-02-18 65 views
0

這是我寫的一個類,用於跟蹤我的Rails應用程序中的後臺活動。Ruby on Rails爲什麼不保存我的數據?

我的問題是status字段被正確更新,但logs字段不是。任何想法爲什麼?

PS1:我可以在tmp_logs包含我想要的數據的日誌中看到,即從根目錄中找到HTML文件)

PS2名單:這個代碼是通過rake運行和delayed_job寶石。

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

嘗試'#save!',它會顯示錯誤。 (他們違背了Ruby慣例,這是一種不安全的方法,它在失敗時引發錯誤。) – Reactormonk 2013-02-18 18:11:17

+0

我沒有收到錯誤,我可以在日誌中看到以下空事務:2013-02-18 19:15:28.981 [meh](0.1ms)開始交易(pid:80725) 2013-02-18 19:15:28.982 [meh](0.0ms)commit transaction(pid:80725) – 2013-02-18 18:16:16

回答

0

我覺得你正在被活躍記錄的變化追蹤捕捉出來。簡而言之,當您調用save Active Record時,只會更新它認爲已更新的列。特別是,如果您修改了某個屬性(例如,調用gsub!或< <),則Active Record不會發現該屬性。

你正在做

self.logs = tmp_logs 

然而,tmp_logs原先設置爲logs,所以self.logstmp_logs是同一個對象。在你完成任務的時候,Active Record比較self.logs和tmp_logs,發現它們是同一個對象,所以不會將列標記爲已更改。

您可以更改代碼,以便Active Record認爲您正在爲日誌列指定一個新值(例如,將tmp_logs設置爲self.logs.dup),或者您可以致電logs_will_change!告訴Active Record您擁有修改了該屬性,並在下次調用保存時更新它。

+0

tmp_logs = self.logs.dup完美工作,解釋清楚。非常感謝! – 2013-02-20 14:36:07

相關問題