Подтвердить что ты не робот

Письменные ассоциации для рекурсивных отношений

немного помогите, если хотите.

Я хотел бы создать отвлекающий контакт с моим классом "продукт". Где я могу иметь один продукт, являющийся родительским продуктом для других продуктов. Мои вопросы: как мне создать отношения в моей модели?

было бы это правильно?

has_many :products
belongs_to :product
4b9b3361

Ответ 1

В предлагаемом решении логически ничего плохого нет. Однако вам, вероятно, нужно сделать что-то вроде этого:

belongs_to :parent, class_name: "Product", foreign_key: "parent_id"
has_many :children, class_name: "Product", foreign_key: "parent_id"

В основном вы храните "дерево", с одним продуктом вверху и ветвями дочерних продуктов под ним, возможно, на многих уровнях.

Стратегия в вашем примере называется Adjacency List. Легко найти прямых родителей и прямых потомков любой записи. Тем не менее, получение ВСЕХ потомков (включая потомков потомков) может быть трудным, и становится все труднее, чем глубже дерево.

Альтернативой, которая часто используется, является Вложенный набор, где каждая запись хранит информацию об объекте в "левом" и "правом". Это позволяет вам построить дерево, независимо от того, насколько оно велико, довольно быстро (или, по крайней мере, эффективно, в одном запросе). Однако это сложнее, и вставка записи обычно означает необходимость пересчета и обновления записей all справа от введенной записи.

Третий вариант (и, возможно, это нечто среднее) использует Перечисление пути, где объекты сохраняют весь путь в дереве. Итак, учитывая такое дерево:

  A
 / \
B   C
    |
    D

A имел бы пустой путь (без родителя), B и C имел бы путь A, D имел бы путь A/C. Большинство операций с вставками относительно недороги с этим решением, а запросы довольно просты. Однако его довольно сложные и движущиеся объекты вокруг дерева могут стать дорогими.

Существуют и другие варианты, такие как Закрывающие таблицы.

Если простой список Adjacency List работает для ваших нужд, тогда перейдите к нему. Это, безусловно, самый простой и простой способ понять. Есть драгоценные камни, которые реализуют вложенные наборы и, возможно, для некоторых других шаблонов деревьев, поэтому вам не нужно делать все тяжелое поднятие, если вы идете по этому маршруту.