使用变形虫宝石克隆Rails

时间:2019-06-28 18:26:46

标签: ruby-on-rails amoeba-gem

克隆时,我在引用特定模型时遇到问题。我已经尝试过使用多种方法,但是都没有获得正确的结果,我认为这与我不了解克隆逻辑的工作原理有关。

这涉及多个模型,但是错误会导致层次结构中最后两个模型之间的相互依赖性。为简单起见,我将尝试使用3个模型对此进行解释,以了解一切的工作方式:Page,PageElement和PageElementDependency

  1. 一个Page有很多PageElements
  2. 一个PageElement有许多dependent_page_element_dependencies和has_many dependee_page_element_dependencies,这两个关系都是PageElementDependency。通过这两个依赖关系,我通过关系设置了以下has_many:has_many :dependees, through: :dependent_page_element_dependencieshas_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

0 个答案:

没有答案