0

「遅い」ジョブのスコープを作成する方法を見つけようとしています。

「遅い」ジョブとは、状態が :in_progress で、:due の日付が今日より古いものです。

(私は州の宝石を使用しておらず、Postgres をデータベースとして使用しています)。

これが私がこれまで行ってきたことです。私は if then ステートメントにかなり慣れていないため、この時点では基本的なスコープしか作成していません。私のモデルでこれを行う方法について何か考えはありますか?

#州

  STATES = %w[bids in_progress complete canceled]
  delegate :bids?, :in_progress?, :complete?, :canceled?, to: :current_state

  def current_state
    (events.last.try(:state) || STATES.first).inquiry
  end

# スコープ

  def self.late
    if @current_state_jobs == :in_progress?
      where('due < ?', Time.now) 
    else
      nil 
    end
  end

late スコープで最初の current_state スコープを使用できますか? わからない

4

1 に答える 1

1

あなたの設定を完全に理解しているかどうかはわかりませんが、あなたを正しい方向に導く手助けができることは確かです.

私が知る限り、:onオプションをメソッドではなく何らかのオブジェクトに設定する必要があるため、デリゲートステートメントが機能するとは思いません。あなたの場合、委任する必要があると私が思うのはstate.inquiry. おそらくそれを行う方法がありますが、方法がわからないのではないかと心配しています。

これは、私にとって非常に役立つと思われるデリゲートに関する簡単な議論です。

http://www.simonecarletti.com/blog/2009/12/inside-ruby-on-rails-delegate/

そのことを念頭に置いて、これらのデリゲート メソッドは依然としてインスタンス メソッドであり、スコープにはクラス メソッドが必要です。

どうあるべきかわかりません@current_state_jobsが、それはインスタンス変数であり、クラス関数にいるので、うまくいかないと思います。あなたが本当に探しているのは単純だと思いますwhere(state: "in_progress")

次に、日付に関するクエリを実行しますが、これは実際にはややこしいことです。注意しないTime.nowと、モジュールが最初にロードされたときにバインドされます。lambdaこれを防ぐには、関数を使用して、関数が呼び出されたときに時間が基づくようにする必要があります。

また、説明の中で、メソッドに「今日より古い」ものをすべて含めたいと述べましたが、クエリが行っているのは「現在より古い」ものです。

すべてを要約すると、次のようなものが必要だと思います。

scope :late, lambda { where("state=? and due < ?", "in_progress", Date.today) }

それが私だったら、おそらく と のように 2 つの異なるスコープに分割しin_progress、be だけにするでしょうが、他の 2 つのスコープのいずれも使用しない場合は不要です。overdue:latein_progress.overdue

それが役立つことを願っています。

于 2013-01-26T18:35:11.483 に答える