我有一个Printer
模型,在其中添加了master
布尔列。打印机belongs_to :restaurant
。master
标志指示该打印机是否是该餐厅的主打印机。
我在打印机模型中有一个方法:
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
如果我将此方法作为before_create
运行,那么创建新打印机将失败。如果我将回调更改为after_validation
,那么创建新对象将完美地工作,即使使用:on => :create
选项也是如此。
Rails是否冻结了对象,这样我就不能在某个点之后再更改值,这将导致我得到Rollback
?感谢您的帮助。
我在Rails 3.2.2和sqlite上处于开发模式。
我认为问题在于返回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