【发布时间】:2011-05-17 14:14:11
【问题描述】:
给出以下定义
Foo
has_many :bars, :dependent => :nullify, :autosave => false
Bar
validates_presense_of :foo
foo_id is not null # database constraint
我想将 Bar 对象重新关联到不同的 Foo 对象。我需要在内存中正确完成所有操作,以便在所有工作验证失败后渲染所有内容。
问题是当我做类似的事情时
bar.foo.bars.delete(bar)
bar.foo = other_foo
other_foo.bars << bar
我在bar.foo.bars.delete(bar) 处遇到了一个失败,一个 sql 更新执行使我的 bar 的 foo_id 属性无效。因此sql约束异常而失败。相反,我需要它只在内存中工作,并在必要时验证失败。
编辑:
问题是这一切都在一个事务中,所以我不关心数据库更新,我只是不希望它们触发数据库约束问题,但我希望我的约束存在并且不允许在db 为我的 Bar 对象。当我的保存执行时,如果它成功,我希望我的保存能够适当地重新关联所有内容。如果失败,我希望我的内存模型处于正确更新(但无效)的状态,这样我可以使用更新的值和更新失败的消息来呈现我的页面。
老实说,我的主要目标是有以下情况:
之前:
foo1.bars => [bar1, bar2]
foo2.bars => [bar3]
之后:
foo1.bars => [bar1]
foo2.bars => [bar3, bar2]
所以我的主要目标是解决这个问题(在内存中完全更新所有适当的对象),如果它涉及不像我已经拥有的那样处理重新关联,我也会接受。
【问题讨论】:
标签: ruby-on-rails activerecord associations