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

我可以在后期范围中使用第一个 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) }

如果是我,我可能会将它分成两个不同的范围,例如in_progress然后overdue只有:latebe in_progress.overdue,但如果你不打算使用其他两个范围中的任何一个,那么它是不必要的。

我希望这会有所帮助。

于 2013-01-26T18:35:11.483 回答