【问题标题】:Access a class method from a model in the Rakefile / Ruby on Rails 3从 Rakefile / Ruby on Rails 3 中的模型访问类方法
【发布时间】:2011-01-16 04:12:20
【问题描述】:

我有一个模型,我们称之为 Foobar。我希望能够运行 cron 作业来更新作为 Foobar 实例的所有对象的属性。所以,在伪代码中,它可能是这样的:

Foobar.all.each do |foobar|
  foobar.update_attributes({:my_attribute => 'updated'});
end

现在,假设我将它包装在一个名为 Foobar.run_update() 的类方法中。

调用 Foobar.run_update() 从控制器,甚至从视图中都可以正常工作。但是,我想做的是从 Rakefile 运行 run_update() 以便我可以将它绑定到 cron 运行中。但是,当从 crontab 调用 Foobar 类时,Rake 无法使用它。

我该如何解决?从 cron 调用 Rake 时,如何从 Rake 访问 Foobars 的类方法?

非常感谢您的帮助。

【问题讨论】:

  • 你所说的 rake 是指 rake 任务吧?
  • 如果您接受投票最高的答案,您的声望将增加三倍! :O

标签: ruby-on-rails ruby ruby-on-rails-3 rake rakefile


【解决方案1】:

对于 rake,如果您的意思是 rake 任务,那么添加 => :environment 会加载该任务的 rails 环境,您可以在那里调用 Foobar.run_update 方法。喜欢,

namespace :foobar do
  task :update => :environment do
    Foobar.run_update
  end
end 

您应该可以从控制台调用rake foobar:update 并将其安排为cronjob。

【讨论】:

    【解决方案2】:

    您可以通过要求 config/environment.rb 来加载 Rails 环境:

    ENV["RAILS_ENV"] ||= "production"
    require '/where/your/rails/project/is/config/environment.rb'

    【讨论】:

      【解决方案3】:

      在我的 Sinatra 应用程序中,我通常有文件 models/init.rb,它需要 Sequel,设置我的数据库连接,然后使用 require_relative 来请求我的所有模型文件。然后我的主应用程序执行require_relative "models/init"

      通过此设置,任何其他脚本(包括 IRB)我所要做的就是自己需要 models/init.rb 文件,并且我可以完全访问应用程序具有的相同模型和数据库连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多