簡體   English   中英

如何運行使用Rails模型的Ruby任務?

[英]How do I run Ruby tasks that use my Rails models?

我有一些基本模型的Rails應用程序。 該網站顯示從其他來源檢索到的數據。 因此,我需要編寫一個Ruby腳本來在數據庫中創建新實例。 我知道我可以使用測試鈎來做到這一點,但是我不確定在這里是否有意義。

我不確定該任務應該是什么樣,如何調用它,或者它在源代碼樹中的位置(lib \\ tasks?)。

例如,這是我的第一次嘗試:

require 'active_record'
require '../app/models/mymodel.rb'

test = MyModel.new
test.name = 'test'
test.save

這失敗,因為它無法連接到數據庫。 這對我的新手大腦來說是一種模糊的理解,因為據推測,Rails正在幕后進行所有不可思議的工作來設置所有東西。 那么如何設置我的小腳本?

您可以只需要environment.rb即可在任何ruby腳本中加載整個Rails環境:

require "#{ENV['RAILS_ROOT']}/config/environment" 

假設設置了RAILS_ROOT環境變量,請參見我的評論以了解其他方法。

這具有額外的好處,即為您提供其余Rails代碼中所有漂亮的類和對象。

要啟動您的進程,聽起來cron會做您想要的事情,我還要在capistrano配方中添加一個任務,該任務會將您的腳本添加到crontab中,以定期從外部源獲取數據並更新數據庫。 使用cronedit gem可以很容易地做到這一點

cron方法確實存在一些缺點,主要是開銷和控制方面的問題,有關其他更復雜的選項,請參見rails Wiki的HowToRunBackgroundJobsInRails

我同意上面的回答,但是您必須在任務中包含=>:environment,否則它將不會加載Rails環境。

例如,

namespace :send do
  namespace :trial do
    namespace :expiry do
      desc "Sends out emails to people who's accounts are about to expire"
      task :warnings => :environment do
        User.trial_about_to_expire.has_not_been_notified_of_trial_expiry.each do |user|
          UserMailer.deliver_trial_expiring_warning(user)
          user.notified_of_trial_expiry = true
          user.save
        end
      end
    end
  end
end

我建議創建自定義的rake任務(lib / task / foo.rake)。 這使您可以輕松訪問rails應用程序的大多數功能。

namespace :foo do
  desc 'do something cool'
  def something_cool
     test = MyModel.new
     test.name = 'test'
     test.save
  end
end

然后:

$ rake -T foo
rake foo:something_cool       # do something cool

您甚至可以通過cronjob運行任務。

您可以這樣在腳本中打開連接:

ActiveRecord::Base.establish_connection(
    :adapter  => "mysql",
    :username => "root",
    :host     => "localhost",
    :password => "******",
    :database => "******" 
)

我敢肯定有一種更優雅的方法可以做到這一點,以便它從您的database.yml中獲取信息。

只需執行幾個步驟,便需要更多細節才能真正回答。

您說您的網站從其他來源檢索數據嗎? 多常? 如果它是半定期的,則您肯定要研究后台處理/消息傳遞。 如果經常發生,您確實希望避免在每次腳本運行時都加載Rails環境,因為每次都將支付過高的啟動稅。

您將要研究多種選擇。 閱讀其中的每一個,特別是發表了他們為什么做出選擇的人的評論,將使您對做出選擇之前需要問自己的問題有一個很好的感覺。 正在加載多少工作? 等等...

在我的頭頂上,這些是您可能需要研究的一些東西

腳本/運行者和Cron后台/ RB Starling工作MemcacheQ Beanstalk后台作業(Bj)delay_job(Dj)守護程序生成器

在“ 鐵軌工作:最佳實踐? ”中查看我的答案。

它包含兩個使用cron運行Rake任務和類方法的示例(通過script/runner )。 在這兩種情況下,都會加載Rails,並且可以使用模型。

尼斯Joyent的編寫使用耙運行升軌道從cron作業任務- http://wiki.joyent.com/accelerators:kb:rails:cron

運行與Rails應用程序/模型交互的ruby任務的最簡單方法是使Rails為您生成Rake任務! :)

這是一個例子

  1. 運行rails g task my_namespace my_task

  2. 這將生成一個名為lib/tasks/my_namespace.rake的文件,如下所示:

namespace :my_namespace do
desc "TODO: Describe your task here"
  task :my_task1 => :environment do
    #write any ruby code here and also work with your models
    puts User.find(1).name
  end
end
  1. 使用rake my_namespace:my_task運行此任務

  2. 觀看與rails模態運行交互的ruby代碼任務!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM