Смоделируйте вилку в 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