I\'m looking for something like CodeIgniter\'s:
$this->db->last_query();
(http://codeigniter.com/user_guide/database/helpers.html)
Probably because I have a newer version of ActiveRecord than when this question was asked, but to get it to work with ActiveRecord 3.2.3 I updated the script of Simone Carletti: I added the extra attribute binds and moved the call to alias_method_chain below the method definition because otherwise it would raise an error saying that it can't find the method.
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
attr_reader :last_query
def log_with_last_query(sql, name, binds=[], &block)
@last_query = [sql, name]
log_without_last_query(sql, name, binds, &block)
end
alias_method_chain :log, :last_query
end
Getting the last query is still the same:
ActiveRecord::Base.connection.last_query # => ...
Your development log should include all SQL queries that are run.
AFAIK, there's no easy way to access the list of queries. Nonetheless you can easily get access to them creating a super simple logger.
If you open the class ActiveRecord::ConnectionAdapters::AbstractAdapter you'll see a method called log. This method is invoked on each query to log the statement. By default, it logs all the statements with the Rails logger.
You can do something like
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
attr_reader :last_query
alias_method_chain :log, :last_query
def log_with_last_query(sql, name, &block)
@last_query = [sql, name]
log_without_last_query(sql, name, &block)
end
end
Now you can get the query with
ActiveRecord::Base.connection.last_query # => ...