的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