如何在没有回调的情况下更新基于updated_at年龄的记录

时间:2013-09-18 05:49:19

标签: ruby-on-rails

我在Rails中有一个记录列表,这些记录有一个布尔字段,可以将它们设为公共或私有。我需要一种方法将每个公共记录更改为私人每次 updated_at> = 30天前。

我不知道从哪里开始。欢迎任何建议,链接和提示。谢谢!

解决方案

根据@ lol007的推荐,我会随时使用gem。我遵循的步骤是:

  1. 使用表格创建应用程序帖子标题:字符串内容:文本状态:布尔值并首次运行服务器以添加信息,然后停止服务器并继续执行其他步骤。
  2. 每当gem到我的gemfile时添加并运行bundle install。
  3. 每当运行时运行。在控制台中创建config / schedule.rb文件
  4. 在models / post.rb中添加下一个代码:

    def self.check_updated_at
      where('updated_at < ?', 30.minutes.ago).update_all({ :status => :true })
    end 
    
  5. 在config / schedule.rb中添加下一个代码:

    every 3.minutes do
      runner "Post.check_updated_at"
    end
    
  6. 因为我正在开发中,我运行下一个命令:

    $ whenever --update-crontab --set environment='development'
    
  7. 然后检查我的cron是否正常工作我运行下一个命令:

    $ crontab -l
    
  8. 我的最后一步是运行rails服务器并开始运行我的应用程序。

  9. 我在测试中使用的其他行是:

        $ whenever -w 
    

    在生产中生成cron文件。和

       $ crontab -r
    

    要删除cron文件,何时不是我想要的。

    谢谢大家的时间和意见。

3 个答案:

答案 0 :(得分:1)

您可以使用Whenever Gem。例如,在config / schedule.rb中:

every 1.day, :at => '4:30 am' do
  runner "YourModel.check_updated_at"
end

在你的模特中:

def self.check_updated_at
  where('updated_at > ?', 30.days.ago).update_all({private: true})
end

答案 1 :(得分:1)

您可以在模型中添加新方法,而不是让数据库字段根据时间自行更新:

class Wtf< ActiveRecord::Base
  #...
  # like this
  def is_public
    updated_at> 30.days.ago
  end

  # or like this
  def self.only_public
    where("updated_at> ?", 30.days.ago)
  end
end

然后使用它:

Wtf.only_public.joins(:somethingelse).where("somethingelses.attribute= 42")

Wtf.first.is_public

答案 2 :(得分:0)

 YourModel.update_all({:private => true}, "updated_at > 30.days.ago")