принадлежит
-
30-09-2019 - |
Вопрос
У меня есть приложение, которое имеет следующие характеристики
There are Clubs Each Club has Teams Each Team has Players
У меня есть таблица пользователей. Пользовательская таблица в основном содержит имя пользователя и пароль для Club Manager, Manager Manager и игрока, чтобы войти в систему.
Как я должен структурировать модели и таблицы?
Я планирую создавать столы для клуба, команды и игроков. Но я не уверен, показ, чтобы структурировать отношения между ними и таблицей пользователей.
Я мог бы создать user_id
в каждой из модели, но отношения будут Club belongs_to User
который не кажется правильным. Кроме того, я бы закончился с пользовательской моделью, которая имеет следующее
has_one :club
has_one :team
has_one :player
Который не прав. У пользователей будет только один из них в любой момент времени.
Есть ли лучший способ структурировать это?
Решение
Под рельсами, has_one
действительно "имеет не более одного". Это прекрасно, чтобы иметь все три has_one
декораторы внутри User
. Отказ Если вы хотите убедиться, что они имели именно один, вы можете добавить проверку, например:
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
Поскольку у вас есть возможность изменить таблицу пользователей в базе данных, я думаю, что я бы поставил club_id
, team_id
, player_id
в users
, и имеют следующее:
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
Я бы даже был искушен переименовать User
так как Manager
, или иметь has_one :manager, :class_name => "User"
в Club
, Team
а также Player
модели, но ваш звонок.