Ruby 以其优雅语法 + 高开发效率深受开发者喜爱,而数据库操作几乎贯穿所有 Ruby 项目。
无论你使用的是 Ruby on Rails,还是 纯 Ruby + ORM / 原生 SQL,下面这 10 个数据库操作要点,都是你必须掌握的硬核基础。
1️⃣ Ruby 中最常见的数据库访问方式
Ruby 操作数据库,主要有三种模式:
| 方式 | 说明 |
|---|---|
| ActiveRecord | Rails 默认 ORM(最常用) |
| Sequel | 轻量、高性能 ORM |
| 原生 SQL | 使用数据库驱动直接执行 |
👉 结论:
- Web 项目:ActiveRecord
- 高性能 / 微服务:Sequel
- 极致控制:原生 SQL
2️⃣ 使用 ActiveRecord 连接数据库
基本配置(Rails)
development:
adapter: mysql2
encoding: utf8mb4
database: demo_db
username: root
password: 123456
host: localhost
ActiveRecord 会自动:
- 建立连接池
- 管理事务
- 处理编码
3️⃣ CRUD 操作(增删改查)必须烂熟于心
新增(Create)
User.create(name: "Tom", age: 20)
查询(Read)
User.where(age: 20)
User.find_by(name: "Tom")
更新(Update)
user.update(age: 21)
删除(Delete)
user.destroy
📌 这是面试必考内容
4️⃣ 查询条件与链式调用技巧
ActiveRecord 的强大之处在于 链式查询:
User.where(status: 1)
.where("age > ?", 18)
.order(created_at: :desc)
.limit(10)
优点:
- 可读性高
- 自动防 SQL 注入
- 延迟执行(Lazy Load)
5️⃣ 关联关系(Association)是核心能力
class Order < ApplicationRecord
belongs_to :user
end
class User < ApplicationRecord
has_many :orders
end
使用:
user.orders
order.user
⚠️ 不理解关联,等于 Rails 只会写一半
6️⃣ N+1 查询问题与性能优化
错误示例(N+1)
User.all.each do |u|
puts u.orders.count
end
正确方式(includes)
User.includes(:orders).each do |u|
puts u.orders.size
end
📌 N+1 是 Rails 性能杀手
7️⃣ 事务(Transaction)必须会用
ActiveRecord::Base.transaction do
user.save!
order.save!
end
作用:
- 保证数据一致性
- 出错自动回滚
- 金融 / 订单系统必备
8️⃣ 使用原生 SQL(必要时)
有些复杂查询 ORM 写起来很难:
sql = "SELECT * FROM users WHERE age > ?"
User.find_by_sql([sql, 18])
✅ 什么时候用 SQL?
- 报表
- 复杂 JOIN
- 性能瓶颈场景
9️⃣ 数据库索引与迁移(Migration)
创建索引
add_index :users, :email, unique: true
修改表结构
rails generate migration AddAgeToUsers age:integer
rails db:migrate
📌 不会 Migration = 不会 Rails
🔟 防止 SQL 注入与安全最佳实践
❌ 错误写法:
User.where("name = '#{params[:name]}'")
✅ 正确写法:
User.where("name = ?", params[:name])
ActiveRecord 默认提供:
- 参数绑定
- 转义机制
- 安全查询接口
🧠 进阶补充(高手必看)
- 使用
pluck减少内存占用 - 使用
select限制字段 - 善用
explain分析 SQL - 合理设置连接池大小
- 避免在循环中频繁查询数据库
📌 总结速览表
| 能力 | 是否必须 |
|---|---|
| CRUD | ✅ |
| 关联查询 | ✅ |
| 事务 | ✅ |
| 性能优化 | ✅ |
| 原生 SQL | ⭐⭐ |
| 数据库索引 | ⭐⭐⭐ |