我有这个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
如果没有更改,一切都很好,除非每个视频都被编入索引,即使没有任何更改。但随着我的更改,当视频尝试保存到数据库时,它会回滚。有什么想法吗?
答案 0 :(得分: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
。< / p>
请改为尝试:
def check_new_record
self.is_new = self.new_record?
true
end
答案 1 :(得分: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