我目前有以下代码:
events.detect do |event|
#detect does the block until the statement goes false
self.event_status(event) == "no status"
end这样做的目的是在event_status方法输出"no status“时输出event的实例(其中events是所有共同调用事件的不同模型的字符串)。
我希望输出还包括延迟的值,其中:
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方法,它是我开始使用的方法,它看起来是有效的,但它不允许我与它一起运行。
发布于 2010-08-22 02:04:47
这并不完全清楚您所要求的是什么,但听起来像是您正在尝试添加延迟,直到您达到某个条件,并同时返回触发该条件的记录。
您可以像使用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]https://stackoverflow.com/questions/3537997
复制相似问题