Rails Everyday Action

时间:2016-03-03 17:44:22

标签: ruby-on-rails

我需要系统每天运行以下代码,但我不知道如何完成此操作。

@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

1 个答案:

答案 0 :(得分:1)

最常规的方法是将其设置为在rails runner中使用cron job执行。

whenever这样的工具通过定义需要在Ruby中执行的频率而不是特殊的,有时难以理解的crontab格式,可以更轻松地创建这些作业。

作为一个说明,User.all是一件非常危险的事情。随着系统中用户数量的增加,将它们全部加载到内存中最终会炸毁您的服务器。您应该以100个左右的组加载它们,以避免内存过载。

此外,如果您在此处设置了正确的wherehas_many关系,则不需要belongs_to条款。我希望这可行:

unless (user.bank)
  user.create_bank(
    bank_type: 2,
    hours: 8
  )
end

目前尚不清楚created_at如何影响这里。这些是每天分配的吗?如果是这样,那应该是bank_date作为DATE类型列,而不是日期和时间。使用created_at时间戳作为关系的一部分是要求麻烦,这应该反映创建记录的时间,仅此而已。