質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3560閲覧

rails の回し続ける処理について。

rubysyoshinsya

総合スコア35

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2016/09/01 10:06

ruby on railsで常に回り続ける処理を行いたいと考えております。

モデルにて以下の様なloopプログラムを作成。

class Test < ActiveRecord::Base def self.tashizan_loop n = 0 loop { if n < 10 puts n n = n + 1 sleep(10) #10秒 else puts n n = 0 sleep(20) #20秒 end } end # self.tashizan_loopのend end #class Test のend

この様なプログラムをバックグランドでこちら側で停止させるまで回し続ける方法はどの様にすると良いのでしょうか?
ターミナル(rails c)で"Test.tashizan_loop"で回す事も可能なのですが、ターミナルを閉じると止まりますので、止まらせずに回し続けたいと考えております。

Loop処理が良いのかなと考えてloopで書いていますが、loop以外でも良い方法があれば教えて頂けると幸いです。
Loopを使わずCronで回す処理も考えましたが1分以下で回す方法が分かりませんでしたので。。。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Railsでは基本的に無限ループな処理を書くことはあまりありません。

これはRailsがWEBアプリケーションとして、リクエストに対して
必ず何らかのレスポンスを返すという設計思想だからですね。

で、それを踏まえた上で、こちらのloopをどのように使う予定なのかを考えて見てください。


  1. バッチ処理
  2. ポーリング処理

(ループを回し続けて、何か仕事が発生したら実行し、仕事が来るまでsleepを繰り返す処理)

もしこのようなをしたいのであれば、rakeタスクとして記述するのが一般的です。

参考: Qiita Rakeタスクをつくる

通常はlib/tasks/ディレクトリの中に、任意の.rakeファイルを作成します。
このファイルは自動的に認識されるので、rakeファイル中で task :タスク名 と書いたものがそのまま、
rake タスク名 として実行されます。

サンプル

ruby

1desc "タスクに対する説明" 2task :your_task_name => :environment do 3 loop do 4 # 繰り返し実行したい内容 5 end 6end

ファイル名とタスク名に関連性はありませんが、通常は同じ名前のtaskか、namespaceを利用します。

実行

bash

1rake your_task_name

namespaceとタスク一覧

参考ではnamespaceが用いられていますが、これはよく使う、 rake db:migrate のdbに当たる部分です。
namespace自体はネスト出来るため、 rake a:b:c:d のように複数の階層を切ることができます。
もちろん、何も指定しなければ rake your_task_name として実行できます。

なお、タスクの一覧を確認したい場合は、rake -vT と打てば、新たに定義したタスクも含めて一覧が出力されます。
この際、descが無いとリストに載らないので注意してください。

補足

environment という記述は、Railsが持っているActiveRecord(モデル)の環境を引き継いで実行するという意味になります。
これを指定しなくてもrakeタスクは作れますが、モデルがDBにアクセスできないため、結果としてRails環境下で書いている意味が薄くなります。

(これ自体はrakeのサブタスクを呼び出す略式記法なのですが、
まずenvironment以外に発展することはあまりないので、今はこれだけ知っていれば良いと思います。)

投稿2016/09/06 16:15

TatumakiGen

総合スコア72

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rubysyoshinsya

2016/09/13 05:03

ご回答頂いたのにご連絡が遅れまして大変申し訳御座いません。 上記解答凄く参考になりました。頂いた内容を元にプログラムを作りたいと思います。 本当に有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問