的3種方法(1失敗)我想出了要
1)使用上的活動記錄觀察者對所有相關的保存,驗證方法
2)開拓活動記錄和在觸發ROLLBACKs的地方放置一個調試器語句,然後運行caller
來查明觸發錯誤的代碼。
3)失敗:覆蓋活動記錄方法並暫停異常。如果我記得這個方法沒有捕獲任何異常,因爲保存方法被封裝在一個事務中。
注意:只有當模式不是Rails.env.production時才啓用。測試Rails 3.2.13,使用紅寶石1.9.3。
1)觀察報:http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#observers
class ActiveRecordObserver < ActiveRecord::Observer
observe "ActiveRecord::Base"
def after_validation(model)
debugger if model.errors.messages.any?
Rails.logger.error "after validation"
end
def before_update(model)
debugger if !model.valid?
Rails.logger.error "before update"
end
def after_update(model)
debugger if !model.valid?
Rails.logger.error "after update"
end
def before_save(model)
debugger if model.errors.messages.any?
Rails.logger.error "#{model}" Rails.logger.error "before save"
end
def after_save(model)
debugger if model.errors.messages.any?
Rails.logger.error "after save"
end
end
2) https://github.com/rails/rails/blob/3-1-stable/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb#L231 CD`束秀activerecord`
Put a debugger statement when where the rollback is executed.
/Users/<user>/.rvm/gems/ruby-1.9.3-<env>/gems/activerecord-3.2.14/lib/active_record/connection_adapters/abstract/database_statements.rb
196 transaction_open = false
197 decrement_open_transactions
198 if open_transactions == 0
199 rollback_db_transaction
200 debugger
=> 201 rollback_transaction_records(true)
202 else
203 rollback_to_savepoint
204 debugger
205 rollback_transaction_records(false)
當軌道服務器或控制檯caller
命中斷點類型,以獲得回溯。
3)在開發模式下重寫AR。 TODO:只有在!Rails.env.production時纔會覆蓋? 在app/config/initializers/active_record_or_any_file_name.rb
ActiveRecord::Base.class_eval do
alias_method :old_save, :save
alias_method :old_save!, :save!
def save(*args)
begin
puts "#{self} save"
Rails.logger.info "#{self} save"
old_save(*args)
rescue Exception => e
debugger
puts e
end
end
def save!(*args)
begin
Rails.logger.info "#{self} save!"
puts "#{self} save!"
old_save!(*args)
rescue Exception => e
debugger
puts e
end
end
end
ROLLBACK的日誌是什麼? – 2012-01-30 06:26:28
沒有錯誤。另外,有一次它使用了一個事務,而下一次它沒有使用它,這很奇怪。除非這兩件事是無關的。 – m33lky 2012-01-30 07:23:12
任何想法是什麼導致事務內的SELECT? – 2012-01-30 07:32:59