Soy nuevo en los rieles y su ayuda y consejo serán muy apreciados ya que lo encuentro desafiante.

Objetivo: quiero que el creador del evento pueda seleccionar más de un usuario como anfitrión para un evento creado (al igual que Facebook permite que el creador de una página pueda seleccionar usuarios como administradores de una página creada). ¿A continuación se muestra cómo se deben mostrar mi modelo y esquema?

Tenía el objetivo de construir algo como esta imagen. Event1 puedo seleccionar a Ian y Jesse como anfitriones, Event2 también puedo seleccionar a Ian de nuevo como anfitrión y seleccionar a Emma

enter image description here

Así es como me lo imagino hasta ahora construido (su orientación sería muy apreciada):

models
user.rb
has_many events

event.rb
belongs_to user

host.rb
belongs_to user
has_many events

esquema

users
name
email

events
title
address
user_id

hosts
user_id
event_id
1
ARTLoe 3 dic. 2016 a las 18:33
¿Su administrador también es un modelo User? o un modelo diferente?
 – 
sa77
3 dic. 2016 a las 18:55

1 respuesta

La mejor respuesta

Comencé a escribir esto como un comentario, pero me di cuenta de que se estaba volviendo demasiado prolijo.

Su modelo está roto ... un event tiene muchos usuarios ... no belong_to un solo user.

Lo que tiene es una relación de muchos a muchos entre usuarios y eventos que debe resolverse a través de una tabla de unión (también conocida como tabla asociativa / de unión). Ha ido de alguna manera a resolver esto con la tabla de hosts, aunque esto va en contra de la convención de rieles.

Lo que quieres es algo como:

modelos

user.rb

has_and_belongs_to_many :events

event.rb

has_and_belongs_to_many :users

Y cree una tabla de combinación que haga referencia a los dos modelos

users table
  name
  email

events table
  title
  address

events_hosts table
  user_id
  event_id

La convención de rieles es que la tabla de unión sea nombrada uniendo los dos nombres de las tablas que está uniendo ordenadamente léxicamente, es decir, eventos antes de los hosts, concatenados juntos para dar events_hosts.

Alternativamente, también puede crear un modelo de unión si lo prefiere:

EventHost

belongs_to :user
belongs_to :event

Y modifique has_and_belongs_to_many a has_many :event_hosts en los otros dos modelos; el esquema de la base de datos seguirá siendo el mismo.

1
David 3 dic. 2016 a las 18:56