Смоделируйте вилку в ActiveRecord

Как выглядят ActiveRecord::Migration и ActiveRecord::Base для класса, который ссылается на себя. Я моделирую объект, который "разветвляется" на существующую запись и сохраняет это отношение в поле:source. Это поле:source будет содержать primary_key:id его родителя.

2 ответа

Решение

ActiveRecord не включает "предопределенные" отношения этого типа, но вы можете определить их самостоятельно, используя has_many а также belongs_to хелперы. Вам нужно будет добавить внешний ключ, например, my_parent_id к модели (я назову это Thing):

rails g migration AddMyParentIdToThings my_parent:references

Затем вам нужно будет определить отношение, определяющее внешний ключ и имена классов:

class Thing < ActiveRecord::Base
  belongs_to :parent_thing, class_name: "Thing", foreign_key: :my_parent_id
  has_many :child_things, class_name: "Thing", foreign_key: :my_parent_id
end

Вы можете опустить :foreign_key вариант на belongs_to (не has_many) если внешний ключ совпадает с именем отношения с добавленным "_id" например:

belongs_to :my_parent, class_name: "Thing"

Когда мне приходилось делать что-то подобное, мне нравилось думать об этом как о модели, которая связана с самим собой.

В вашем файле миграции вы просто добавили бы parent_id как целое число для этой таблицы / модели

class Category < ActiveRecord::Base
  belongs_to  :parent, :class_name => "Category",  :foreign_key => :parent_id
  has_many :children,  :class_name => "Category",  :foreign_key => :parent_id
end
Другие вопросы по тегам