belongs_to has_one構造
-
30-09-2019 - |
質問
次の特性を持つアプリケーションがあります
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_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
モデル、しかしあなたの呼び出し。
所属していません StackOverflow