2013-02-18 2 views
0

내 Rails 애플리케이션에서 백그라운드 활동을 추적하기 위해 작성한 클래스입니다.Ruby on Rails가 내 데이터를 저장하지 않는 이유는 무엇입니까?

제 문제는 status 필드가 올바르게 업데이트되었지만 logs 필드가 올바르지 않다는 것입니다. 왜 그런가?

PS1 :이 코드는 rake를 통해 실행되고 delayed_job 보석 : 내가 루트 디렉토리에서 발견 HTML 파일)

PS2의 목록을 즉, tmp_logs 내가 원하는 데이터가 포함 된 로그를 볼 수 있습니다.

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

+0

오류가 발생하지 않으며 로그에 다음 빈 트랜잭션이 표시됩니다. 2013-02-18 19 : 15 : 28.981 [meh] (0.1ms) 트랜잭션 시작 (pid : 80725) 2013-02-18 19 : 15 : 28.982 [meh] (0.0ms) 커밋 트랜잭션 (pid : 80725) –

답변

0

여기 활성 레코드의 변경 내용 추적으로 인해 캐치가되고 있다고 생각합니다. 요약하면, 저장 호출 Active Record는 업데이트 한 것으로 생각하는 열만 업데이트합니다. 특히 속성을 제자리에서 수정하면 (예 : gsub! 또는 < <) 활성 레코드는 그 사실을 발견하지 못합니다.

당신은 그러나, tmp_logs 이전 logs로 설정

self.logs = tmp_logs 

을하고

, 그래서 self.logstmp_logs는 같은 객체. 할당을 수행하는 시점에서 Active Record는 self.logs와 tmp_logs를 비교하여 동일한 객체이며 변경된 것으로 표시하지 않습니다.

액티브 레코드가 로그 열에 새 값을 할당한다고 생각하도록 코드를 변경하거나 (예 : tmp_logs를 self.logs.dup로 설정) logs_will_change!으로 전화하여 활성 레코드에 알릴 수 있습니다 다음에 save가 호출 될 때 그 속성이 수정되어야한다는 것을 의미한다.

+0

tmp_logs = self.logs.dup가 완벽하게 작동하고 설명은 분명합니다. 고마워요! –

관련 문제