Как я могу видеть SQL, который будет сгенерирован данным запросом ActiveRecord в Ruby on Rails

Можно записать пользовательскую задачу MSBuild сделать это. Взгляните на этот подход

112
задан Marc-André Lafortune 19 January 2010 в 02:26
поделиться

6 ответов

Когда я последний раз пытался это сделать, официального способа сделать это не было. Я прибег к использованию функции, которую find и его друзья используют для непосредственной генерации своих запросов. Это частный API, поэтому существует огромный риск того, что Rails 3 полностью его сломает, но для отладки это нормальное решение.

Метод - construct_finder_sql (options) ( lib / active_record / base.rb: 1681 ) вам придется использовать send , потому что он частный.

Правка : construct_finder_sql был удален в Rails 5.1.0.beta1 .

11
ответ дан 24 November 2019 в 02:45
поделиться

Это то, что я обычно делаю, чтобы сгенерировать SQL в консоли

-> script/console
Loading development environment (Rails 2.1.2)
>> ActiveRecord::Base.logger = Logger.new STDOUT
>> Event.first

. Это нужно делать, когда вы сначала запустите консоль, если вы сделаете это после того, как наберете какой-то код, он, похоже, не работает

Не могу поверить в это, нашел это давным-давно в чьем-то блоге и не могу вспомнить, чей это есть.

11
ответ дан 24 November 2019 в 02:45
поделиться

Создайте файл .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, который будет казнен.

10
ответ дан 24 November 2019 в 02:45
поделиться

Вы можете изменить метод журнала подключения, чтобы вызвать исключение, предотвращающее выполнение запроса.

Это полный взлом, но, похоже, у меня он работает (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
1
ответ дан 24 November 2019 в 02:45
поделиться

Подобно 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
187
ответ дан 24 November 2019 в 02:45
поделиться

Попробуйте плагин show_sql. Плагин позволяет вывести SQL без его запуска

SampleModel.sql(:select => "DISTINCT(*)", :conditions => ["`date` > #{self.date}"], :limit => 1, :order => '`date`', :group => "`date`")
2
ответ дан 24 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: