Вопрос

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

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 модели, но ваш звонок.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top