Клонирование рельсов с амебой
У меня возникают проблемы со ссылками на конкретную модель при клонировании. Я пытался использовать несколько подходов, но ни один из них не дал правильного результата, и я считаю, что это связано со мной, не понимая, как работает логика клонирования.
Это включает в себя несколько моделей, но ошибка возникает во взаимозависимости между двумя последними моделями в иерархии. Для простоты я попытаюсь объяснить это с помощью 3 моделей, чтобы понять, как все работает: Page, PageElement и PageElementDependency
Page
имеет многоPageElements
PageElement
имеет многоdependent_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
Допустим, я пытаюсь клонировать страницу №3 с PageElement#4 и PageElement#5, где есть PageElementDependency, где зависимым является PageElement#4, а зависимым (от которого зависит) является PageElement#5.
Так что в основном здесь мы сможем получить доступ PageElement.find(5).dependees
=> PageElement#6
и если я сделаю PageElement.find(6).dependents
=> PageElement#5
,
Итак, при попытке клонировать страницу № 3 я ожидал получить новую страницу № 4 с PageElement#6 и PageElement#7, и вот важная часть, PageElementDependency, где зависимым является PageElement#6, а зависимым является PageElement#7.
Однако, когда я пытаюсь клонировать PageElementDependencies, только один из столбцов получает новое значение, а другой столбец сохраняет старое значение PageElement. Таким образом, в приведенном примере я получил бы PageElementDependency, где зависимый является правильным: PageElement#6, но зависимый не обновляется и остается как PageElement#5.
Я не уверен, как использовать переназначение для того, чтобы получить связанный "новый" и "старый" объект зависимостей, поэтому я не совсем уверен, как действовать дальше.
Я также опубликовал это как проблему в github: https://github.com/amoeba-rb/amoeba/issues/84