在Rails4中堆栈级别太深的after_save回调

时间:2013-12-17 12:31:18

标签: ruby-on-rails mongodb mongoid

我的模型是这样的,

class Slot
  include Mongoid::Document
  after_save :calculate_period

  field :slot, type: Array

  def calculate_period
    if condition
     do something
    end
  self.slot = true
  save
  end

end

提交按钮后会显示此错误, SlotsController中的SystemStackError #create 堆栈级别太深

也消耗更多时间。如果我从def calculate_period中删除了保存,则值不存储after_save回调。

任何解决方案...... !!!

2 个答案:

答案 0 :(得分:4)

您应该将此更改为before_save,这样您可以更改模型的属性,然后它们将照常保存到数据库中。

class Slot
  include Mongoid::Document
  before_save :calculate_period

  def calculate_period
    if condition
      #do something
    end
  end

end

答案 1 :(得分:3)

你有无限循环 - save方法调用calculate_period调用回调,包括你的calculate_period回调。我想到的第一个解决方案是添加虚拟属性并在调用回调方法之前检查它:

class Slot
  include Mongoid::Document
  after_save :calculate_period, unless: :period_calculated # I'm not sure if Mongoid allows this
  attr_accessor :period_calculated

  def calculate_period
    if condition
      # do something
    end
    self.period_calculated = true
    save
  end
end