克隆时,我在引用特定模型时遇到问题。我尝试过使用多种方法,但都没有得到正确的结果,我相信这与我不了解克隆的逻辑是如何工作的有关。
这涉及多个模型,但在层次结构中最后两个模型之间的相互依赖关系中会出现错误。为简单起见,我将尝试使用 3 个模型来解释这一点,以了解一切是如何工作的:Page、PageElement 和 PageElementDependency
- A
Page
有很多PageElements
- A
PageElement
有 manydependent_page_element_dependencies
和 has_manydependee_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