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

Модель рельсов 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
4b9b3361

Ответ 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

Ответ 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