簡體   English   中英

在Ruby / Rails中使用if / then為當前狀態創建范圍

[英]Create scope for current state using if/then in Ruby / Rails

我試圖弄清楚如何為“后期”工作創建范圍。

“遲到”的工作將是狀態為:in_progress的工作,其中:due日期早於今天。

(我沒有使用任何狀態的gem,而將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

我可以在后一個范圍中使用第一個current_state范圍嗎? 我不確定

我不確定我是否完全了解您的設置,但是我當然可以幫助您將方向正確。

我不相信您的委托語句會起作用,因為據我所知,它需要將: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) }

如果是我,我可能會將其分為in_progressoverdue兩個不同的范圍,然后:late只是in_progress.overdue ,但是如果您不打算使用其他兩個范圍中的任何一個,那就沒有必要了。

希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM