2

在为我正在从事的当前项目定义模型设计时,我有点困惑。

这是一个运动队管理应用程序,所以我可以让来自不同运动的团队添加球员。因为对于每项运动我都想为球员存储不同的信息,所以我考虑过使用以下模型。

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

但这似乎是重复的,我只会有很多 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

至于你的另一个问题

本质上,您将拥有一张属性表、一张球员表和一组球队。创建一个足球队和球员(足球=足球是吗?)将是这样的(让我们决定我们已经创建了一个团队):

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 Guides - 稍作更改):

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 回答
0

也许是这样的:

团队:

has_many :type_of_sports, :through => type_of_sport_on_team
has_many :players, :through => types_of_sports

type_of_sport:

has_many :teams, :through => type_of_sport_on_team
has_many :players

type_of_sport_on_team:

belongs_to :team
belongs_to :type_of_sport

玩家:

belongs_to :type_of_sport

附加信息后:

Class Player < ActiveRecord::Base
     attr_accessible :name, :surname, :age
end

Class BasketballPlayer < Player
     attr_accessible :free_throw_average
end

Class SoccerPlayer < Player
     attr_accessible :penalty_scores
end
于 2013-04-03T09:50:38.397 回答