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,它分配falseself.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

一方面,您可以摆脱在 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 回答