0

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

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

解决方案

根据@lol007 的建议,我每次使用 gem 时都会使用。我遵循的步骤是:

  1. 创建一个带有表格的应用程序 Post title:string content:text status:boolean 并在服务器第一次运行以添加信息,然后停止服务器并继续其他步骤。
  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 服务器并开始运行我的应用程序。

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

    $ whenever -w 

在生产中生成 cron 文件。和

   $ crontab -r

要删除 cron 文件,什么时候不是我想要的。

谢谢大家的时间和投入。

4

3 回答 3

1

您可以使用每当宝石。例如,在 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
于 2013-09-18T06:02:02.243 回答
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
于 2013-09-18T06:02:51.960 回答
0
 YourModel.update_all({:private => true}, "updated_at > 30.days.ago")
于 2013-09-18T05:55:56.970 回答