0

我有一个Printer模型,我添加了一个master布尔列。一台打印机belongs_to :restaurantmaster标志表明这台打印机是否是这家餐厅的主要打印机。

我在打印机模型中有一个方法:

def set_master_on_create
  if self.restaurant.printers.empty?
    self[:master] = true
  else
    self[:master] = false
  end
end

并设置此回调:before_create :set_master_on_create

如果我将此方法作为 a 运行,before_create那么创建新打印机将失败。如果我将回调更改为after_validation创建新对象,即使使用该:on => :create选项也将完美无缺。

Rails 是否冻结了对象,所以我不能再在某个点之后更改值,这会导致Rollback我得到?任何帮助表示赞赏。

我在 Rails 3.2.2 和开发模式下的 sqlite 上。

4

1 回答 1

1

我认为问题在于返回 false 的 before_create 方法会阻止您的对象被保存。尝试添加一个return true

我猜你设置了这样的主属性:self.master = true

def set_master_on_create
  if self.restaurant.printers.empty?
    self.master = true
  else
    self.master = false
  end

  return true
end

如果 before_* 回调取消了操作,则会发出 ROLLBACK。您还可以触发 ROLLBACK 在任何回调中引发异常,包括 after_* 挂钩。但是请注意,在这种情况下,客户端需要注意它,因为普通保存会引发此类异常,而不是悄悄返回 false。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

于 2012-03-04T21:53:21.013 回答