首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails日常行动

Rails日常行动
EN

Stack Overflow用户
提问于 2016-03-03 17:44:22
回答 1查看 53关注 0票数 0

我需要系统每天运行以下代码,但我不知道如何做到这一点。

代码语言:javascript
复制
@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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 17:50:01

最传统的方法是将其设置为使用rails runner job中执行。

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

值得注意的是,User.all是一件非常危险的事情。随着系统中用户数量的增加,将它们全部装入内存将最终摧毁您的服务器。您应该在100左右的组中加载它们,以避免内存超载。

此外,如果您已经在这里设置了适当的wherebelongs_to关系,则不应该使用该belongs_to子句。我认为这是可行的:

代码语言:javascript
复制
unless (user.bank)
  user.create_bank(
    bank_type: 2,
    hours: 8
  )
end

目前还不清楚created_at是如何影响到这里的。这些是每天分配的吗?如果是这样的话,那应该是类似于bank_dateDATE类型列,而不是日期和时间。使用created_at时间戳作为关系的一部分是自找麻烦,这应该反映记录创建时的情况,仅此而已。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35779286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档