2010-08-24 2 views
1

У меня есть приложение, которое имеет следующие характеристикиbelongs_to структуры has_one

There are Clubs 
Each Club has Teams 
Each Team has Players 

У меня есть таблица пользователей. Таблица пользователя в основном содержит имя пользователя и пароль для менеджера клуба, менеджера команды и игрока для входа в систему.

Как структурировать модели и таблицы?

Я планирую создавать таблицы для клуба, команды и игроков. Но я не уверен, чтобы показать структуру отношений между ними и таблицей пользователей.

Я мог бы создать user_id в каждой модели, но отношения будут Club belongs_to User, что кажется неправильным. Кроме того, у меня будет модель пользователя, которая имеет следующие значения:

has_one :club 
has_one :team 
has_one :player 

Неправильный вариант. У пользователя будет только один из них в любой момент времени.

Есть ли лучший способ структурировать это?

+0

Непонятно, что представляет Пользователь. Если в Клубе есть Команды, а у Команды есть игроки, что/есть/Пользователь? Что у него есть, что это? – Chowlett

+0

Извините, что .. Я отредактировал вопрос, чтобы уточнить таблицу пользователя. – Addy

+0

А, я вижу. Пользователь по существу является «менеджером» для одного из Клуба, Команды или Игрока. У вас есть возможность изменить таблицу пользователей в БД? – Chowlett

ответ

1

Under Rails, 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 мо dels, но ваш звонок.

+0

Я думал о добавлении трех идентификаторов в пользовательскую таблицу. Как мы будем определять идентификацию «субъекта», который вошел в систему. Для каждого пользователя будет только один из club_id или team_id или player_id. У меня будет проверка всех трех, чтобы узнать, принадлежит ли пользователь клубу, команде или игроку. Любой лучший способ перейти от модели User к Club/Team/Player? – Addy

+0

Я подозреваю, что вы можете сделать что-то умное с помощью 'abstract_class? 'Или полиморфной ассоциации; но я был бы склонен просто использовать метод в User like 'def managed; клуб || команда || игрок; end' – Chowlett

Смежные вопросы