К сожалению, в Rails 2.x это на самом деле довольно сложно. Я уже публиковал аналогичный вопрос о переполнении стека и в конце концов углубился в исходный код Rails, чтобы найти способ. Это просто не спроектировано таким образом, чтобы позволить это.
Я закончил тем, что выполнил запрос в транзакции, которую я откатил, и для длины транзакции установил в логгере мой собственный объект StringIO, который я мог прочитать после.
Это из памяти, но, надеюсь, вы понимаете это достаточно, чтобы настроить его, если он не работает:
Model.transaction do
Model.logger = str = StringIO.new
Model.complex_scope.chained_complex_scope
Model.logger = ActiveRecord::Base.logger
str.rewind
str = str.read
# perform some regex on str to get the actual query
raise ActiveRecord::Rollback
end
Это ужасно ужасно, и мне это никогда не нравилось (я завернул его в sql { Model. complex_scope.chained_complex_scope }
), но это вроде как сработало (хотя я использовал его только в разработке, поэтому у меня была некоторая терпимость к ошибкам)