首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于内存中操作的复制芒果映射器关联

用于内存中操作的复制芒果映射器关联
EN

Stack Overflow用户
提问于 2012-03-09 16:40:18
回答 1查看 152关注 0票数 0

我想从数据库中抓取一个对象1和对象2 (两个对象都有两个has_many关联) 2。创建对象3,它是对象1的克隆,因此还没有关联。复制对象2的关联并将它们添加到对象3的关联3中。在内存4中使用新的对象3。退出进程而不对数据库进行永久更改-对象1和对象2在进程退出时仍然有它们的原始关联。

反而发生了什么

  1. 我从数据库中获取一个对象1和对象2(两者都有两个has_many关联)
  2. 我创建对象3,它是对象1的克隆,因此还没有关联。
  3. 我复制对象2的关联,并将它们添加到对象3的关联中。
  4. 我使用新的对象3在内存中进行操作。
  5. 但是,我退出了这个过程,但是现在对数据库对象2进行了永久的更改-对象2不再具有其关联,因为它们的键已更改为(临时)对象3 id。

这是我的密码。请注意,所有这些都包含一个数组,其中包含任意#的对象。

代码语言:javascript
复制
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时,我得到一个空数组。

救命!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-12 01:03:31

蒙哥马佩尔的协会可能有点过于热衷于储蓄。我想改头换面,但这不是一个容易的问题。

当保存发生时,将告诉您的代码是proxy.rb。当您执行my_association = [...]时,replace是调用的方法。

唯一不进行任何保存的方法是build,因此您可以像这样构建临时对象:

代码语言:javascript
复制
tmp = all.last.clone
all.each do |instance|
  instance.association1.each { |doc| tmp.association1.build(doc.attributes) }
  tmp.association1.uniq!
  # ...
end

更一般地,您可以将所有相关文档转换为数组,而不必担心保存.

代码语言:javascript
复制
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,如果这是您需要走的路线。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9637726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档