Модель рельсов has_many сама по себе
У меня есть модель события. События могут иметь родительские события, заданные из столбца в модели (parent_event_id). Мне нужно иметь возможность делать has_many :event
на модели, поэтому я могу просто сделать, например, event.child_event
или event.parent_event
. Но мой поисковик не очень хорошо справился.
Моя модель:
class Event < ActiveRecord::Base
attr_accessible :days_before, :event_name, :event_date, :list_id, :recipient_email, :recipient_name, :parent_event_id, :is_deleted, :user_id
belongs_to :user
has_many :event_email
has_many :event
end
Моя схема:
create_table "events", :force => true do |t|
t.datetime "event_date"
t.integer "days_before"
t.string "recipient_email"
t.integer "list_id"
t.string "recipient_name"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
t.string "event_name"
t.integer "parent_event_id"
t.boolean "is_deleted", :default => false
end
Ответы
Ответ 1
Это самореференциальная модель, вы можете попробовать что-то вроде этого:
class Event < ActiveRecord::Base
belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id"
has_many :child_events, :class_name => "Event", :foreign_key => "child_event_id"
end
Таким образом, вы можете вызвать @event.parent, чтобы получить объект события ActiveRecord и @event.child_events, чтобы получить коллекцию объектов EventRecord объектов
Ответ 2
Вы хотите изменить свой has_many на что-то вроде этого:
has_many :parent_events, class_name: 'Event'
has_many :child_events, ->(event) { where parent_event_id: event.id }, class_name: 'Event'
Это из рельсов 4 документа по ссылке:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
В частности, раздел "Настройка запроса".
Это должно позволить вам делать то, что вы ищете. Не пробовал это локально, но это похоже на то, что я должен был сделать, чтобы реализовать приложение для футбольного пикета, которое я сделал некоторое время назад.
Надеюсь, что это поможет.
Ответ 3
У Rails уже есть жемчужина для обеспечения вложенной древовидной структуры родословной. Это будет лучше всего в таких сценариях:
https://github.com/stefankroes/ancestry
Вы сможете получить доступ к следующим методам:
event.parent
event.children
event.siblings
Ответ 4
Попробуйте Вложенный шаблон набора
Для этого: Awesome Nested Set
Ответ 5
Я обнаружил, что в Rails 5 по умолчанию стало обязательным по умолчанию, поэтому не удалось сохранить экземпляры моей модели... добавление необязательно в первую строку рекомендуемого решения устраняет это...
class Event < ActiveRecord::Base
belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id", optional: true
has_many :child_events, :class_name => "Event", :foreign_key => "parent_event_id"
end