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を使用する必要があるかもしれないと思っていましたが、それらを完全にまとめていません(たとえば、メソッドに渡されるブロックがdelay = +である場合、そうだと思います)。**

私は.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]

これにより、このメソッドが 2 回呼び出され、どちらもすべてのレコードを反復処理して計算を行います。このように使用する必要がある場合は、操作ごとに特別な目的の関数を作成するか、結果を変数にキャッシュして使用することもできます。

# 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 に答える