Rails seeds.rb执行终端评论数显示为0,实际数据库存在数据的问题
问题根源:Rails查询缓存的“小陷阱”
你遇到的这个情况,十有八九是Rails的查询缓存在作祟。当你在seeds.rb里执行Comment.all.length时,如果之前的代码里已经调用过Comment.all(哪怕是不小心触发的),Rails就会把那次的空结果缓存起来。后面哪怕你创建了一堆评论数据,再次调用Comment.all.length时,它直接就用缓存里的空数组长度了,根本不会去数据库重新查一遍。
而到了dbconsole或者pry控制台,这是全新的进程,没有之前的缓存残留,自然能查到真实的数据。
解决办法,选一个就行
1. 用count代替length
Comment.count会直接给数据库发一个SELECT COUNT(*)的SQL请求,完全不依赖Rails的查询缓存,拿到的就是实时的数量:
puts "Created #{Comment.count} comments..."
2. 强制绕过缓存重新查询
要是你非得用all,可以加个reload强制刷新数据:
puts "Created #{Comment.all.reload.length} comments..."
或者用unscoped跳过所有作用域和缓存:
puts "Created #{Comment.unscoped.all.length} comments..."
3. 检查代码顺序
最后再确认下你的puts语句是不是放在所有评论数据创建完成之后的,要是不小心把输出写在创建代码前面,那输出0就太正常了😂
内容的提问来源于stack exchange,提问作者achacttn
相关产品推荐
相关产品推荐

