rails中的has_one关系验证

时间:2009-07-30 17:32:41

标签: ruby-on-rails validation activerecord associations

由于has_one未提供before_add回调以允许验证, 如何阻止rails破坏旧的关联,即使在 新的没有通过验证?

苏珊:has_one:衬衫 衬衫:belongs_to:susan

susan.shirt = a_nice_shirt

这会破坏事先存在的任何关联, 即使新衬衫从未真正关联,因为它没有通过 验证,留下一个赤膊苏珊(好吧,实际上留下一件衬衫 背后不属于任何人..)。

susan.build_shirt

做同样的事情

我忽略了错过的before_add回调是否有充分的理由?

3 个答案:

答案 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中,通常在尝试将对象保存到数据库(使用savesave!)时进行验证,而不是在修改时。如果出于任何原因,您希望在验证失败时恢复旧值,则可以reload对象或使用新的dirty attributes feature

答案 2 :(得分:0)

看看这张票:

http://dev.rubyonrails.org/ticket/10518

如果您有以下内容,那么此处描述的功能似乎仍然存在:dependent =&gt; :破坏你的协会。

就个人而言,我认为这是rails中的一个错误。