2

現在取り組んでいるプロジェクトのモデル設計を定義する際に、少し混乱しています。

スポーツ チーム管理アプリなので、さまざまなスポーツのチームに選手を追加できます。スポーツごとに異なる情報をプレイヤーに保存したいので、次のモデルを用意することを考えました。

A team:
-> has_many soccer_players
-> has_many basketball_players
-> ...

しかし、これは繰り返しのようで、スポーツの種類ごとに 1 つずつ、たくさんの has_many を用意します。私の質問は、ユーザーがチームを作成するときにスポーツの種類を選択するため、関連付けを定義するだけでよいということです。したがって、チームがサッカー チームの場合は、' has_many soccer_players' だけが必要です。

どうすればそれができますか?またはさらに良いことに、これをより良い方法でモデル化するにはどうすればよいでしょうか?

ありがとう

4

2 に答える 2

1

Zippie が提供したものと、コメントであなたが尋ねたことに従って、少し修正したバージョンを提供します。

これをフレーズに分解してから、Ruby クラスと関連付けに分解します。

  • チームには多くのプレイヤーがいます
  • チームには多くのチーム属性があります
  • プレーヤーには多くの属性があります

これにより、アプリケーションの一部が簡素化される可能性があります。検証などのためのチーム モデル自体。名前、体重、高さなど、一般的な属性と動的な属性を決定する必要があります。これは、すべてのプレーヤーがそれらを持っているため、Playerモデル内ではなくモデル内にある可能性があるためAttributeです。

したがって、次のようなものを使用できます。

class Team < ActiveRecord::Base
  has_many :players
  has_many :attributes, :as => :attributable
end

class Player < ActiveRecord::Base
  belongs_to :team
  has_many :attributes, :as => :attributable
  attr_accessible :name, :weight, :height
end

class Attribute < ActiveRecord::Base
  belongs_to :attributable, :polymorphic => true
  attr_accessible :name, :value
end

あなたの他の質問として

基本的に、属性のテーブルが 1 つ、プレーヤーのテーブルが 1 つ、チームのテーブルが 1 つになります。フットボールのチームと選手 (フットボール = サッカー?) を作成するのは次のようになります (すでにチームを作成しているとしましょう):

player = Player.new
player.name = 'Lionel Messi'
player.attributes << Attribute.create!(:name => :playing_position, :value => :second_striker)
@team.players << player
@team.attributes << Attribute.create!(:name => :uefa_cups, :value => 4)

移行は次のようになります (Rails ガイドから直接取得 - マイナーな変更を加えたもの):

class CreateAttributes < ActiveRecord::Migration
  def change
    create_table :attributes do |t|
      t.string :name
      t.string :value
      t.references :attributable, :polymorphic => true
      t.timestamps
    end
  end
end
于 2013-04-03T10:00:27.443 に答える