自定义验证到位后保存记录时出错

时间:2012-09-13 16:25:36

标签: ruby-on-rails ruby activerecord attr-accessor

我有这个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

如果没有更改,一切都很好,除非每个视频都被编入索引,即使没有任何更改。但随着我的更改,当视频尝试保存到数据库时,它会回滚。有什么想法吗?

2 个答案:

答案 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