我需要系统每天运行以下代码,但我不知道如何完成此操作。
@user = User.all
date = Date.today
if date.workingday?
@user.each do |user|
if !Bank.where(:user_id => user.id , :created_at => (date.beginning_of_day..date.end_of_day) , :bank_type => 2 ).exists?
banco = Bank.new()
banco.user = user
banco.bank_type = 2
banco.hours = 8
banco.save
end
end
end
答案 0 :(得分:1)
最常规的方法是将其设置为在rails runner
中使用cron
job执行。
像whenever
这样的工具通过定义需要在Ruby中执行的频率而不是特殊的,有时难以理解的crontab
格式,可以更轻松地创建这些作业。
作为一个说明,User.all
是一件非常危险的事情。随着系统中用户数量的增加,将它们全部加载到内存中最终会炸毁您的服务器。您应该以100个左右的组加载它们,以避免内存过载。
此外,如果您在此处设置了正确的where
和has_many
关系,则不需要belongs_to
条款。我希望这可行:
unless (user.bank)
user.create_bank(
bank_type: 2,
hours: 8
)
end
目前尚不清楚created_at
如何影响这里。这些是每天分配的吗?如果是这样,那应该是bank_date
作为DATE
类型列,而不是日期和时间。使用created_at
时间戳作为关系的一部分是要求麻烦,这应该反映创建记录的时间,仅此而已。