ActiveRecord allows you to query the database directly using execute() or use a query to populate ActiveRecord objects with find_by_sql().
execute() returns the result in whatever form the underlying database driver uses. I think that's about as transparent an abstraction you could ask for. You can completely ignore ActiveRecord's abstractions.
find_by_sql() returns an array of ActiveRecord objects.