在处理数据库批量操作时,比如导出用户数据、清理过期记录,总免不了要用到ref="/tag/147/" style="color:#C468A7;font-weight:bold;">循环。Ruby 作为一门简洁优雅的语言,提供了多种写法来实现循环,掌握这些基本功,写脚本效率翻倍。
最常用的 for 循环
for 循环适合遍历数组或范围,写法直观。比如要打印1到5的数字:
for i in 1..5
puts i
end
如果是处理数据库查出来的用户列表,也可以这么用:
users = ['Alice', 'Bob', 'Charlie']
for user in users
puts "正在处理用户:#{user}"
end
更 Ruby 风格的 each 循环
Ruby 社区更推荐使用 each,它更符合语言习惯。上面的例子改写成 each 就是:
users.each do |user|
puts "正在处理用户:#{user}"
end
或者用大括号简写:
users.each { |user| puts "Hello, #{user}" }
在处理 ActiveRecord 查询结果时特别顺手,比如批量更新用户状态:
User.where(active: false).each do |user|
user.update(last_seen: Time.now)
end
while 循环按条件执行
当你不确定循环次数,只关心某个条件是否成立时,while 就派上用场了。比如监控日志文件是否写入完成:
processing = true
while processing
if File.size('log.txt') > 1024
processing = false
else
sleep 1
end
end
until:和 while 刚好相反
until 是“直到条件为真才停止”,逻辑上和 while 相反。比如等待数据库备份完成:
until File.exist?('backup.sql')
puts '等待备份中...'
sleep 2
end
puts '备份已就绪!'
break 和 next 控制流程
有时候不需要走完整个循环。比如遍历用户时跳过测试账号:
users.each do |user|
next if user == 'test_user'
puts "处理正式用户:#{user}"
end
又或者找到目标就停下,避免浪费资源:
users.each do |user|
if user == 'admin'
puts '发现管理员,停止扫描'
break
end
puts "检查用户:#{user}"
end