1

我目前有以下代码:

events.detect do |event|

#detect does the block until the statement goes false

  self.event_status(event) == "no status"

end

这样做是在 event_status 方法输出“无状态”时输出事件的实例(其中事件是一串不同的模型,它们都统称为事件)。

我希望输出还包括延迟值,其中:

delay = delay + contact.event_delay(event)

event_delay 方法尚未编写,但在查看事件完成与应该完成之间的延迟时,它与 event_status 类似(可能是多余的,但我稍后会处理)。

以下是 event_status 当前的外观以供参考:

  def event_status target
  # check Ticket #78 for source

    target_class= target.class.name
    target_id   = target_class.foreign_key.to_sym

    assoc_name  = "contact_#{target_class.tableize}"

    r = send(assoc_name).send("find_by_#{target_id}", target.id) 
    return "no status" unless r
    "sent (#{r.date_sent.to_s(:long)})" 
  end

我的输出概念应该是 [event,delay],例如,我可以将其作为 Array[:event] 或 Array[:delay] 访问以获取值。

****我在想也许我应该在一个方法上使用yield,但还没有把各个部分放在一起(例如,传递给方法的块应该是延迟=+,我认为是)。**

我不喜欢 .detect 方法,这是我开始使用的方法,它似乎有效,但它不允许我在它旁边运行计数。

4

1 回答 1

0

尚不完全清楚您要的是什么,但听起来您正在尝试增加延迟,直到达到某个条件,并同时返回触发该条件的记录。

您可能会Enumerable#detect像以前一样使用它,但要在旁边保留一个计数:

def next_event_info
  next_event = nil
  delay = 0

  events.detect do |event|
    case (self.event_status(event))
    when "no status"
      true
    else
      delay += contact.event_delay(event)
      false
    end
  end

  [ next_event, delay ]
end

更新是否要为所有事件添加所有延迟,但还要找到状态为 的第一个事件"no status"

def next_event_info
  next_event = nil
  delay = 0.0

  events.each do |event|
    case (self.event_status(event))
    when "no status"
      # Only assign to next_event if it has not been previously
      # assigned in this method call.
      next_event ||= event
    end

    # Tally up the delays for all events, converting to floating
    # point to ensure they're not native DB number types.
    delay += contact.event_delay(event).to_f
  end

  {
    :event => next_event,
    :delay => delay
  }
end

这会给你一个Hash作为回报,你可以询问为info[:event]info[:delay]。请记住不要滥用此方法,例如:

# Each of these makes a method call, which is somewhat expensive
next_event = next_event_info[:event]
delay_to_event = next_event_info[:delay]

这将对该方法进行两次调用,这两个调用都将遍历所有记录并进行计算。如果您需要以这种方式使用它,您不妨为每个操作创建一个特殊用途的函数,或者将结果缓存在一个变量中并使用它:

# Make the method call once, save the results
event_info = next_event_info

# Use these results as required
next_event = event_info[:event]
delay_to_event = event_info[:delay]
于 2010-08-21T18:04:46.683 回答