質問

次の特性を持つアプリケーションがあります

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

それは正しくありません。ユーザーは、いつでもそのうちの1つだけを持っています。

これを構成するより良い方法はありますか?

役に立ちましたか?

解決

レールの下、 has_one 本当に「せいぜい」です。 3つすべてを持つことは完全に有効です has_one デコレーター User. 。正確に1つしかないことを確認する場合は、たとえば検証を追加できます。

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_idusers, 、そして次のことを持っています:

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, TeamPlayer モデル、しかしあなたの呼び出し。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top