如何通过Rake任务检查投票状态?本地运行任务无响应求助
问题分析与解决方案
你的Rake任务没起作用,核心原因是直接操作Poll类的属性,而非单个Poll实例的属性:
原代码里的check_status是实例方法,针对每个Poll对象生效,但你在Rake任务里用了Poll.start_date、Poll.poll_active——这些是类调用,但start_date、poll_active是实例属性(属于单个投票记录),类本身没有这些属性,导致逻辑判断失效,自然没有输出和状态更新。
修正后的Rake任务
直接复用你已有的check_status方法,遍历所有Poll实例执行更新:
namespace :change_poll_status do task :poll_status => :environment do Poll.find_each do |poll| poll.check_status poll.save! # 强制保存,出错时会抛出异常便于调试 puts "投票ID #{poll.id} 状态更新为:#{poll.poll_active ? '活跃' : '已过期'}" end end end
如果不想依赖check_status方法,也可以在任务里直接写判断逻辑:
namespace :change_poll_status do task :poll_status => :environment do Poll.find_each do |poll| poll.poll_active = Date.today.between?(poll.start_date, poll.expiration_date) poll.save! puts "投票ID #{poll.id} 状态更新为:#{poll.poll_active ? '活跃' : '已过期'}" end end end
关键注意事项
- 使用
find_each而非all.each:处理大量投票记录时,find_each会分批加载数据,避免内存溢出。 - 用
save!代替save:如果保存失败(比如字段验证不通过),save!会直接抛出异常,帮你快速定位问题,而save只会默默返回false。 - 本地测试时,可以先加条件筛选特定投票,比如
Poll.where(id: 1).find_each,方便快速验证逻辑。
内容的提问来源于stack exchange,提问作者Arturo Gabriel
相关产品推荐
相关产品推荐

