Ассоциации MongoMapper могут быть немного переусердствовали с экономией.Я хочу пересмотреть его когда-нибудь, но это не простая проблема.
Код, который сообщит вам, когда произойдет сохранение, - many_documents_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
, если my_obj == my_obj2
.См. в этом обсуждении для стратегий по реализации вашего собственного метода #hash
, если вам нужен этот путь.