由于has_one
未提供before_add
回调以允许验证,
如何阻止rails破坏旧的关联,即使在
新的没有通过验证?
susan.shirt = a_nice_shirt
这会破坏事先存在的任何关联, 即使新衬衫从未真正关联,因为它没有通过 验证,留下一个赤膊苏珊(好吧,实际上留下一件衬衫 背后不属于任何人..)。
susan.build_shirt
做同样的事情
我忽略了错过的before_add
回调是否有充分的理由?
答案 0 :(得分:2)
我不确定为什么回调不存在,但你总是可以向模型中添加一个Observer,并验证before_save中的新关联。我假设“susan”是一个用户模型实例,衬衫必须是红色才能通过验证。
class UserObserver< ActiveRecord::Observer
def before_save(user)
return false if user.shirt.color != "red"
end
end
如果在观察者中返回false,则对象将不会保存。当然,您当前的“susan”实例仍然具有无效关联。我不是肯定的,但如果你将观察者中的before_save_改为这样的话:
class UserObserver< ActiveRecord::Observer
def before_save(user)
if user.shirt.color != "red"
user.reload
false
end
end
可能会刷新用户的实例。我从来没有试过这个。
答案 1 :(得分:0)
在Rails中,通常在尝试将对象保存到数据库(使用save
或save!
)时进行验证,而不是在修改时。如果出于任何原因,您希望在验证失败时恢复旧值,则可以reload
对象或使用新的dirty attributes feature。
答案 2 :(得分:0)
看看这张票:
http://dev.rubyonrails.org/ticket/10518
如果您有以下内容,那么此处描述的功能似乎仍然存在:dependent =&gt; :破坏你的协会。
就个人而言,我认为这是rails中的一个错误。