0

ビデオを保存し、インデックスを作成し、更新するこの API があります。インデックス作成の時間を短縮するために、変更されたビデオまたは新しいビデオのみをインデックス化するための検証を追加することにしました。それがそうであった前に:

class Video < ActiveRecord::Base

  after_save :index_me

  def index_me
    Resque.enqueue(IndexVideo, self.id)
  end

end

私が行った変更は次のとおりです。

class Video < ActiveRecord::Base

  before_save :check_new_record
  after_save :index_me

  def check_new_record
    self.is_new = self.new_record?
  end

  def index_me
    if self.changed? || self.is_new
      Resque.enqueue(IndexVideo, self.id)
    end
  end

end

何も変更されていなくても、すべてのビデオがインデックスに登録されることを除いて、変更がなければすべて問題ありません。しかし、私の変更により、ビデオがデータベースに保存しようとするとロールバックします。何かご意見は?

4

2 に答える 2

2

私が間違っていなければ、beforeコールバックが返さfalseれると、トランザクションはロールバックされます。 それがおそらく起こっていることです。

def check_new_record
    self.is_new = self.new_record?
end

self.new_record?返すfalseと、 に代入falseされself.is_new、次にメソッドが を返します。self.is_newこれもfalse同様です。

代わりにこれを試してください:

def check_new_record
    self.is_new = self.new_record?
    true
end
于 2012-09-14T02:39:49.840 に答える
0

1 つには、レコードが after_save で新しいかどうかを検出する必要があるハックを取り除くことができます。レコードが新しい場合、.changed? メソッドは true を返します。

class Video < ActiveRecord::Base
  after_save :index_me

  def index_me
    Resque.enqueue(IndexVideo, self.id) if self.changed?
  end
end
于 2012-09-13T17:01:25.810 に答える