Можно записать пользовательскую задачу MSBuild сделать это. Взгляните на этот подход
Когда я последний раз пытался это сделать, официального способа сделать это не было. Я прибег к использованию функции, которую find
и его друзья используют для непосредственной генерации своих запросов. Это частный API, поэтому существует огромный риск того, что Rails 3 полностью его сломает, но для отладки это нормальное решение.
Метод - construct_finder_sql (options)
( lib / active_record / base.rb: 1681
) вам придется использовать send
, потому что он частный.
Правка : construct_finder_sql
был удален в Rails 5.1.0.beta1 .
Это то, что я обычно делаю, чтобы сгенерировать SQL в консоли
-> script/console
Loading development environment (Rails 2.1.2)
>> ActiveRecord::Base.logger = Logger.new STDOUT
>> Event.first
. Это нужно делать, когда вы сначала запустите консоль, если вы сделаете это после того, как наберете какой-то код, он, похоже, не работает
Не могу поверить в это, нашел это давным-давно в чьем-то блоге и не могу вспомнить, чей это есть.
Создайте файл .irbrc в вашем домашнем каталоге и вставьте его в:
if ENV.include?('RAILS_ENV') && !Object.const_defined?('RAILS_DEFAULT_LOGGER')
require 'logger'
RAILS_DEFAULT_LOGGER = Logger.new(STDOUT)
end
Это будет выводить операторы SQL в ваш сеанс irb по мере вашего продвижения.
РЕДАКТИРОВАТЬ: Извините, это выполнит запрос все еще, но он самый близкий, о котором я знаю.
РЕДАКТИРОВАТЬ: Теперь с arel вы можете создавать области / методы, пока объект возвращает ActiveRecord :: Relation и вызывает .to_sql для него, и он будет помещать sql, который будет казнен.
Вы можете изменить метод журнала подключения, чтобы вызвать исключение, предотвращающее выполнение запроса.
Это полный взлом, но, похоже, у меня он работает (Rails 2.2.2, MySQL):
module ActiveRecord
module ConnectionAdapters
class AbstractAdapter
def log_with_raise(sql, name, &block)
puts sql
raise 'aborting select' if caller.any? { |l| l =~ /`select'/ }
log_without_raise(sql, name, &block)
end
alias_method_chain :log, :raise
end
end
end
Подобно Penger, но работает в любое время в консоли даже после того, как классы были загружены и регистратор был кэширован:
Для Rails 2:
ActiveRecord::Base.connection.instance_variable_set :@logger, Logger.new(STDOUT)
Для Rails 3.0.x:
ActiveRecord::Base.logger = Logger.new(STDOUT)
Для Rails> = 3.1.0 это уже сделано по умолчанию в консолях. В случае, если он слишком шумный и вы хотите отключить его , вы можете сделать:
ActiveRecord::Base.logger = nil
Попробуйте плагин show_sql. Плагин позволяет вывести SQL без его запуска
SampleModel.sql(:select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")