Pregunta

Tengo una aplicación que tiene las siguientes características

There are Clubs
Each Club has Teams
Each Team has Players

Tengo una tabla de usuarios. La tabla de usuario contiene básicamente el nombre de usuario y la contraseña para el gerente del club, el director del equipo y el jugador a entrar en el sistema.

¿Cómo debo estructurar los modelos y las tablas?

tengo la intención de crear tablas de club, equipo y jugadores. Pero no estoy seguro de espectáculo para estructurar la relación entre ellos y la tabla de usuarios.

Me podría crear user_id en cada uno de los modelos, pero la relación sería Club belongs_to User que no parece correcto. Además iba a terminar con un modelo de usuario que tiene la siguiente

has_one :club
has_one :team
has_one :player

Lo que no está bien. Un usuario tendrá sólo uno de ellos en un momento dado.

¿Hay una mejor manera de estructurar esto?

¿Fue útil?

Solución

Bajo rieles, has_one es realmente "tiene como máximo una". Es perfectamente válido tener los tres decoradores has_one en User. Si desea asegurarse de que sólo tienen precisamente uno, se podría añadir una validación, por ejemplo:

class User < ActiveRecord::Base
  has_one :club
  has_one :team
  has_one :player

  validate :has_only_one

  private

  def has_only_one
    if [club, team, player].compact.length != 1
      errors.add_to_base("Must have precisely one of club, team or player")
    end
  end
end

Dado que usted tiene la capacidad de cambiar la tabla de usuarios en la base de datos, creo que pondría club_id, team_id, player_id en users, y tienen la siguiente:

class Club < ActiveRecord::Base
  has_one :user
  has_many :teams
  has_many :players, :through => :teams
end

class Team < ActiveRecord::Base
  has_one :user
  belongs_to :club
  has_many :players
end

class Player < ActiveRecord::Base
  has_one :user
  belongs_to :team
  has_one :club, :through => :team
end

class User < ActiveRecord::Base
  belongs_to :club
  belongs_to :team
  belongs_to :player

  validate :belongs_to_only_one

  def belongs_to_only_one
    if [club, team, player].compact.length != 1
      errors.add_to_base("Must belong to precisely one of club, team or player")
    end
  end
end

Me había incluso sentir la tentación de cambiar el nombre de User como Manager, o tienen has_one :manager, :class_name => "User" en los modelos Club, Team y Player, pero su llamada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top