0
0
RailsHow-ToBeginner · 3 min read

How to Use Raw SQL in Rails: Syntax and Examples

In Rails, you can run raw SQL queries using ActiveRecord::Base.connection.execute or ActiveRecord::Base.connection.select_all. These methods let you execute any SQL directly on the database while still using Rails models and connections.
📐

Syntax

Use ActiveRecord::Base.connection.execute(sql) to run any SQL command. For queries that return rows, select_all(sql) returns an ActiveRecord::Result object which behaves like an array of hashes. Replace sql with your raw SQL string.

  • execute: Runs SQL, returns database-specific result object.
  • select_all: Runs SELECT queries, returns ActiveRecord::Result.
ruby
sql = "SELECT * FROM users WHERE active = true"
result = ActiveRecord::Base.connection.execute(sql)
💻

Example

This example shows how to fetch all active users using raw SQL and print their names.

ruby
sql = "SELECT id, name FROM users WHERE active = true"
results = ActiveRecord::Base.connection.select_all(sql)

results.each do |row|
  puts "User ID: #{row['id']}, Name: #{row['name']}"
end
Output
User ID: 1, Name: Alice User ID: 3, Name: Bob User ID: 7, Name: Carol
⚠️

Common Pitfalls

Common mistakes include:

  • Not sanitizing inputs, which risks SQL injection.
  • Using execute for SELECT queries and expecting an array of hashes.
  • Ignoring database-specific SQL syntax differences.

Always use parameter binding or sanitize inputs to avoid security issues.

ruby
unsafe_name = "Robert'); DROP TABLE users;--"
sql = "SELECT * FROM users WHERE name = '#{unsafe_name}'" # Unsafe!

# Safe way using sanitize_sql_array:
safe_sql = ActiveRecord::Base.send(:sanitize_sql_array, ["SELECT * FROM users WHERE name = ?", unsafe_name])
results = ActiveRecord::Base.connection.select_all(safe_sql)
📊

Quick Reference

MethodPurposeReturns
execute(sql)Run any SQL commandDatabase-specific result object
select_all(sql)Run SELECT queriesActiveRecord::Result (array-like of hashes)
select_one(sql)Run SELECT returning one rowHash of one row
select_value(sql)Run SELECT returning one valueSingle value
sanitize_sql_array(array)Safely insert parametersSanitized SQL string

Key Takeaways

Use ActiveRecord::Base.connection.execute or select_all to run raw SQL in Rails.
Always sanitize inputs to prevent SQL injection when using raw SQL.
select_all returns an ActiveRecord::Result which behaves like an array of hashes; execute returns a database-specific result.
Use sanitize_sql_array to safely insert parameters into raw SQL queries.
Raw SQL is useful for complex queries but use ActiveRecord methods when possible.