我想从数据库中抓取一个对象1和对象2 (两个对象都有两个has_many关联) 2。创建对象3,它是对象1的克隆,因此还没有关联。复制对象2的关联并将它们添加到对象3的关联3中。在内存4中使用新的对象3。退出进程而不对数据库进行永久更改-对象1和对象2在进程退出时仍然有它们的原始关联。
反而发生了什么
这是我的密码。请注意,所有这些都包含一个数组,其中包含任意#的对象。
object1 = all.last.clone #we take the most recently created object
all.each do |instance|
instance_association1 = (instance.association1).dup
object1.association1 += instance_association1 #BUG this moves the association
object1.association1.uniq!
instance_association2 = (instance.association2).dup
object1.association2 += instance_association2
object1.association2.uniq!
end注意,现在当我说: all.last.association1时,我得到一个空数组。
救命!!
发布于 2012-03-12 01:03:31
蒙哥马佩尔的协会可能有点过于热衷于储蓄。我想改头换面,但这不是一个容易的问题。
当保存发生时,将告诉您的代码是proxy.rb。当您执行my_association = [...]时,replace是调用的方法。
唯一不进行任何保存的方法是build,因此您可以像这样构建临时对象:
tmp = all.last.clone
all.each do |instance|
instance.association1.each { |doc| tmp.association1.build(doc.attributes) }
tmp.association1.uniq!
# ...
end更一般地,您可以将所有相关文档转换为数组,而不必担心保存.
associations1 = []
associations2 = []
all.each do |doc|
associations1 += doc.associations1.to_a
associations2 += doc.associations2.to_a
end
assocations1.uniq!
assocations2.uniq!不过,小心点!Ruby的uniq方法看起来像是使用Ruby的#hash方法来计算等式,在这种情况下,这可能不会给出您想要的结果。做一些测试以确保my_obj.hash == my_obj2.hash if my_obj == my_obj2。有关实现您自己的这一讨论方法的策略,请参阅#hash,如果这是您需要走的路线。
https://stackoverflow.com/questions/9637726
复制相似问题