0

私のモデルは次のようになります。

class Job < ActiveRecord::Base
  attr_accessor :start_time

  def start_time
    self.start_time = Time.now
  end

  def elapsed_time
    end_time = Time.now
    elapsed = end_time - self.start_time
  end

end

経過時間を計測したいのですがself.start_time、メソッド内に存在しますstart_time。しかし、私のelapsed_time方法でself.start_timeは、ゼロです。何故ですか?

Rails 4.1.0 と Ruby 2.0.0 を使用しています。

4

2 に答える 2

1

start_time初期化を使用して、いつジョブ オブジェクトを作成するかを定義する必要があります。

class Job < ActiveRecord::Base
  attr_accessor :start_time

  def initialize
    self.start_time = Time.now
  end

  def elapsed_time
    end_time = Time.now
    elapsed = end_time - self.start_time
  end

end

ジョブの初期化時に縛られたくない場合は、インスタンス変数を作成して開始時刻を保持し、メソッドstart_timeを呼び出すときにそれを参照する必要があります。elapsed_time

class Job < ActiveRecord::Base
  attr_accessor :start_time

  def start_time
    @start_time = Time.now
  end

  def elapsed_time
    end_time = Time.now
    elapsed = end_time - @start_time
  end

end
于 2014-04-15T05:08:11.527 に答える
0

Beartechの答えは正しいですが、その理由を説明しましょう。

attr_accessorモデルの作成settergetterメソッド。db 属性が定義される方法と同様に、これらはオブジェクト ( @object.method) で呼び出すメソッドを作成します。つまり、オブジェクトが作成されたときにのみ作成されます。

あなたの問題は、attr_accessorオブジェクトインスタンス間で永続化することに依存していることです。つまり、データはリクエスト間で永続化されません。説明したように、これbeartechを修正する方法は、メソッド内にデータを何らかの方法で「保存」するstart_timeことです。これは、オブジェクト/クラスを初期化するときに行うのが最適です。

于 2014-04-15T06:35:28.173 に答える