belongs_to estructura has_one
-
30-09-2019 - |
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?
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.