0

これにはいくつかの段階がありますが、私は比較的レールに慣れていないため、これに最善の方法でアプローチしているかどうかはわかりません。

ユーザーは会社をフォローし、会社のアプリケーションは特定の日に開閉します。ユーザーが会社をフォローしている場合、a)会社のアプリケーションが開いたとき、b)会社のアプリケーションが閉じる1週間前、c)会社のアプリケーションが閉じた日に、自動的にメールが届くようにします。

名前付きスコープを使用してみました。日付に応じて、各企業のスコープを設定する次のモデル方法(これには少し作業が必要になると思います)があります。

モデルfirms.rb

   def application_status
     if open_date == Today.date
      self.opening = true
     else
      self.opening = false
     end 

    if ((close_day - Today.date) == 7)
     self.warning = true
      else
     self.warning = false
    end 

    if close_day == Today.date
     self.closing = true
      else
     self.closing = false
    end 
 end

このメソッドを1日1回各企業で呼び出して、各企業が適切なスコープを持つようにしたいので、everyone gem(cron)と次のコードを使用してみました。上記のモデルメソッドを各企業で実行します。

Schedule.rb

every 1.day do 
 runner "Firm.all.each do |firm|
  firm.application_status
 end"
end

次に、スコープのオープン、警告、クローズのそれぞれについて、いつでもスケジュールファイルにメソッドがあります。簡単にするために、オープンメソッドだけを示します。次のクエリは、開始スコープが適用されているすべての企業に対してクエリを実行し、それらに対してapplication_open_notificationメソッドを実行します。

Schedule.rb

every 1.day do
 runner "Firm.opening.each do |firm|
  firm.application_open_notification
 end"
end

これにより、Firm.rbモデルで次のメソッドが呼び出されます

def application_open_notification
  self.users.each do |user|
   FirmMailer.application_open(user, self).deliver
  end
end

これにより、パズルの最後のピースが呼び出されます...これにより、会社の名前を含む電子メールがユーザーに送信されます。

def application_open(user,firm)
  @firm = firm
  @user = user
    mail to: @user.email, subject: @firm' is now accepting applications'
  end
 end

これは、この問題に取り組むための実行可能な方法ですか?特に、私はモデルでのコーディングにあまり精通していません。

あなたが提供できるどんな助けにも感謝します。

4

1 に答える 1

1

とはデータベース フィールドでありopening、次のようなスコープがあると思います。warningclosing

class Firm < ActiveRecord::Base
    scope :opening, :where => { :opening => true }
    # etc
end

データベース (および、すべてのストレージ) には一般的なルールがあります。必要でない場合は、計算できるものを保存しないでください。

アプリケーションのステータスは、その日の日付とopen_dateおよびclose_dayフィールドから判断できるため、追加のフィールドを作成する代わりに、必要に応じてそれらを計算できます。SQL と Active Record を使用してこれを行うことができます。

scope :opening, :where { :open_date => (Date.today .. Date.today+1) }
scope :warning, :where { :close_day => (Date.today+7 .. Date.today+8) }
scope :closing, :where { :close_day => (Date.today .. Date.today+1) }

date(これらは時間範囲を選択することに注意してください。またはフィールドを使用しているかどうかに応じて、変更する必要がある場合がありtimeます。)

しかし、別の問題があります。何らかの理由 (コンピューターのクラッシュ、コードのバグなど) で、スケジュールされたプログラムが特定の日に実行されない場合はどうなりますか? 何かが壊れた場合でも、通知が最終的に確実に送信されるようにする方法が必要です。次の 2 つの解決策があります。

  1. オプションで今日以外の日付を受け入れるようにスケジュール プログラムを記述します (経由ARGV)
  2. 各種類の通知が送信されたかどうかについて、各会社のフラグを保持します。これらはデータベースに保存する必要があります。

スコープは必要ないことに注意してください。あなたはこれを行うことができます:

Firm.where(:open_date => (Date.today .. Date.today+1)).each do |firm|
   #...
end

しかし、範囲は少なくとも、さまざまなレコード セットを識別する詳細をカプセル化します。

于 2012-04-11T01:24:10.930 に答える