我有一个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。
答案 0 :(得分: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_ * hooks。但请注意,在那种情况下 客户需要注意它,因为普通的保存会提高 这样的例外,而不是悄悄地返回false。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html