![](/img/trans.png)
[英]How do I run a ruby script, that I put in my /lib/tasks/ directory in my Rails app, once?
[英]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任務! :)
這是一個例子
運行rails g task my_namespace my_task
這將生成一個名為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
使用rake my_namespace:my_task
運行此任務
觀看與rails模態運行交互的ruby代碼任務!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.