3

Rails アプリケーションにいくつかの非 Rails モデル テーブルを統合しています。すべてが非常にうまく機能します。モデルをセットアップする方法は次のとおりです。

class Change < ActiveRecord::Base
  establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"])
  set_table_name  "change"
end

このようにChangeして、既存のすべてのレコードにモデルを使用できますfind

レコードがテーブルに追加されたときに、何らかの通知を実行したいと思います。モデルは経由Change.newで作成されないため、Change.save使用ActiveRecord::Observerはオプションではありません。

新しいレコードが追加されるたびに、Rails コードの一部を実行する方法はありますか? 私は見ましdelayed_jobたが、それを設定する方法を理解できませんでした。ジョブが最後に実行されてから作成されたすべての行を選択し、各行のそれぞれの Rails コードを呼び出す cron ジョブを中心に展開すると思います。

更新現在 Java のWhenを見ていると、「cron 部分から Rails コードを実行する」を解決できるようです。

4

3 に答える 3

1

状態の変化を監視する場合と同様に、ポーリングと通知の 2 つの方法があります。今のところ、ポーリングの方法を選択したようです (cron ジョブで定期的にデータベースの状態を確認し、変更された場合はコードを実行します) Rails スケジューラの 1 つを使用して同じことを行うことができます。そこにはいくつかあります(Googleはそれらを簡単に見つけることができます。さまざまな機能セットがあります。そのようになった場合は、必要に応じて選択できるようにします)

データベースによっては、通知方法を試すこともできます。一部のデータベースは、トリガーと外部プロセスの実行または特定の通知プロトコルの両方をサポートしています。この場合、テーブルが変更されたことがデータベース自体から通知されます。データベースからのイベントの取得には、さまざまな DBMS 用の多くのオプションがあります。

于 2010-04-14T08:56:01.430 に答える
1

ええ、ある種のバックグラウンド タスク プロセッサ (Delayed::Job は人気のあるものの 1 つです。または、Daemon ライブラリなどを使用して独自のものを偽造することもできます) が必要になるか、ある種のスケジュールで実行される cronjob をセットアップする必要があります。 . 頻繁に (たとえば、毎分) チェックしたい場合は、Delayed::Job ルートをお勧めします。より長い場合 (1 時間ごとなど) は、cron ジョブで問題なく実行できます。

DJ ルートに進むと、新しいレコードをチェックし、レコードがあれば処理し、ジョブが完了すると「完了」とマークされるため、ジョブを再キューイングするジョブを作成する必要があります。

-ジョン

于 2010-04-02T19:47:22.737 に答える
1

これが私が最終的に行ったことです: Use When Everyは、Capistrano とうまく統合され、cron 内から Rails コードを実行する方法を示したからです。私の行方不明の平和は基本的に

script/runner -e production 'ChangeObserver.recentchanges'

現在は 5 分ごとに実行されています。recentchangestmp ファイルから最後に参照した ID を読み取り、それよりも高い ID を持つすべての新しいレコードChangeを取得し、各レコードに対して通常のオブザーバー コードを実行します (そして、最大の参照 ID を tmp ファイルに保存します。コース)。

于 2010-04-14T08:36:29.237 に答える