克隆时,我在引用特定模型时遇到问题。我已经尝试过使用多种方法,但是都没有获得正确的结果,我认为这与我不了解克隆逻辑的工作原理有关。
这涉及多个模型,但是错误会导致层次结构中最后两个模型之间的相互依赖性。为简单起见,我将尝试使用3个模型对此进行解释,以了解一切的工作方式:Page,PageElement和PageElementDependency
Page
有很多PageElements
PageElement
有许多dependent_page_element_dependencies
和has_many dependee_page_element_dependencies
,这两个关系都是PageElementDependency
。通过这两个依赖关系,我通过关系设置了以下has_many:has_many :dependees, through: :dependent_page_element_dependencies
和has_many :dependents, through: :dependee_page_element_dependencies
。总结一切看起来像这样:#models/page.rb
has_many :page_elements, -> { order(position: :asc) }, inverse_of: :page, dependent: :destroy
amoeba do
enable
clone [:page_elements]
end
#models/page_element.rb
has_many :dependent_page_element_dependencies, foreign_key: :dependent_id, inverse_of: :dependent, class_name: "PageElementDependency", dependent: :destroy
has_many :dependees, through: :dependent_page_element_dependencies
has_many :dependee_page_element_dependencies, foreign_key: :dependee_id, inverse_of: :dependee, class_name: "PageElementDependency", dependent: :destroy
has_many :dependents, through: :dependee_page_element_dependencies
amoeba do
enable
clone [:dependee_page_element_dependencies, :dependent_page_element_dependencies]
end
#models/page_element_dependency.rb
belongs_to :dependent, class_name: "PageElement", inverse_of: :dependent_page_element_dependencies, foreign_key: :dependent_id
belongs_to :dependee, class_name: "PageElement", inverse_of: :dependee_page_element_dependencies, foreign_key: :dependee_id
比方说,我正在尝试使用PageElement#4和PageElement#5克隆Page#3,其中有一个PageElementDependency,其中依赖项是PageElement#4,而被依赖者(依赖者)是PageElement#5。
因此基本上,在这里我们可以访问PageElement.find(5).dependees
=> PageElement#6
,如果我执行PageElement.find(6).dependents
=> PageElement#5
。
因此,当尝试克隆Page#3时,我希望获得一个具有PageElement#6和PageElement#7的新Page#4,这是重要的部分,一个PageElementDependency,其中依赖项是PageElement#6,而受抚养者是PageElement#7。
但是,当我尝试克隆PageElementDependencies时,只有一列正在获取新值,而另一列则保留旧的PageElement值。因此,在给定的示例中,我将获得一个PageElementDependency,其中受抚养人是正确的:PageElement#6,但该受抚养人不会更新,而是保留为PageElement#5。
我不确定如何使用重映射器来获取相关性的相关“新”和“旧”对象,因此我不确定如何继续。
我也将此问题发布在github中:https://github.com/amoeba-rb/amoeba/issues/84