У меня проблемы со ссылками на конкретную модель при клонировании. Я пытался использовать несколько подходов, но ни один из них не дал правильного результата, и я считаю, что это связано со мной, не понимая, как работает логика клонирования.
Это включает в себя несколько моделей, но ошибка возникает во взаимозависимости между двумя последними моделями в иерархии. Для простоты я попытаюсь объяснить это с помощью 3 моделей, чтобы понять, как все работает: Page, PageElement и PageElementDependency
- A
Page
имеет много PageElements
- A
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
Допустим, я пытаюсь клонировать страницу №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