ruby-on-rails - many - rails model references
el modelo de rails tiene_mucho de sí mismo (5)
Descubrí que en Rails 5 el pertenece se ha convertido en obligatorio de forma predeterminada, por lo que no pude guardar las instancias de mi modelo ... agregar una opción a la primera línea de la solución recomendada corrige esto ...
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
Tengo un modelo de evento. Los eventos pueden tener eventos principales, establecidos a partir de una columna en el modelo (parent_event_id). Necesito poder hacer has_many :event
en el modelo, así que puedo hacer, por ejemplo, event.child_event
o event.parent_event
. Pero mi Google no funcionó tan bien.
Mi modelo:
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
Mi esquema:
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
Deseará cambiar su has_many a algo como esto:
has_many :parent_events, class_name: ''Event''
has_many :child_events, ->(event) { where parent_event_id: event.id }, class_name: ''Event''
Esto es de los 4 documentos del riel en el enlace: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Específicamente, la sección sobre "personalizar la consulta". Esto debería permitirle hacer lo que está buscando. No lo intenté localmente, pero esto es similar a lo que tuve que hacer para implementar una aplicación de fútbol pickem que hice hace un tiempo.
Espero que esto ayude.
Este es un modelo autorreferencial, puedes probar algo como esto:
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
De esta forma, puede llamar a @ event.parent para obtener un objeto Evento ActiveRecord y @ event.child_events para obtener una colección ActiveRecord de objetos Event
Pruebe el patrón de conjunto anidado
Para este: Awesome Nested Set
Rails ya tiene una gema para proporcionar ancestros de estructura de árbol anidados. Será mejor en tales escenarios:
https://github.com/stefankroes/ancestry
Podrás acceder a los siguientes métodos:
event.parent
event.children
event.siblings