根据 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