gpt4 book ai didi

ruby-on-rails - 将子对象重新关联到另一个父对象-Rails(2.3.11)删除has_many关联对象,而无需执行SQL操作

转载 作者:行者123 更新时间:2023-12-02 04:09:27 25 4
gpt4 key购买 nike

给出以下定义

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约束异常和失败。相反,我需要它仅在内存中工作并且在必要时无法通过验证。

编辑:

问题是这一切都在事务中,所以我不在乎数据库更新,我只是不希望它们触发数据库约束问题,但是我希望约束存在,并且不允许在我的数据库中使用null值条对象。执行保存后,如果保存成功,我希望保存重新关联所有内容。如果失败,则我希望内存模型处于正确更新(但无效)的状态,这样我可以用更新的值和更新失败的消息来呈现页面。

坦白地说,我的主要目标是遇到以下情况:

之前:
foo1.bars => [bar1, bar2]
foo2.bars => [bar3]

后:
foo1.bars => [bar1]
foo2.bars => [bar3, bar2]

因此,我的主要目标是解决这个问题(在内存中对所有适当对象进行全面更新),如果它不涉及像我已经拥有的重新关联,我也将接受。

最佳答案

要从父项的(foo1)条形集合中删除关联的子项(bar1)元素,可以使用

foo1.bars.delete_if{|b| b.id == bar1.id}

这会将bar1从foo1的bar集合中删除,但是bar1在数据库中将保持不变,因为 delete_if在HasManyAssociation构建于其上的Enumerable上起作用。

关于ruby-on-rails - 将子对象重新关联到另一个父对象-Rails(2.3.11)删除has_many关联对象,而无需执行SQL操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6032129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com