首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby on Rails中使用.detect输出计算值?(或.detect的替代方案)

如何在Ruby on Rails中使用.detect输出计算值?(或.detect的替代方案)
EN

Stack Overflow用户
提问于 2010-08-21 23:09:05
回答 1查看 294关注 0票数 1

我目前有以下代码:

代码语言:javascript
复制
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是所有共同调用事件的不同模型的字符串)。

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

代码语言:javascript
复制
delay = delay + contact.event_delay(event)

虽然还没有编写event_delay方法,但它与event_status类似(可能是冗余的,但我将在稍后讨论),因为它可以查看事件完成时间和应该完成事件之间的延迟。

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

代码语言:javascript
复制
  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方法,它是我开始使用的方法,它看起来是有效的,但它不允许我与它一起运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-22 02:04:47

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

您可以像使用Enumerable#detect一样使用它,但通过在边上保留一个计数:

代码语言:javascript
复制
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"的事件,请使用更新

代码语言:javascript
复制
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]进行查询。请记住不要滥用此方法,例如:

代码语言:javascript
复制
# Each of these makes a method call, which is somewhat expensive
next_event = next_event_info[:event]
delay_to_event = next_event_info[:delay]

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

代码语言:javascript
复制
# 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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3537997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档