После того, что предложил Zippie и что вы спросили в комментарии, я предлагаю немного измененную версию.
Я разобью его на фразы, а затем на рубиновые классы и ассоциации, поэтому, если вы хотите сделать его по-настоящему полиморфным,
- В команде много игроков
- Команда имеет много Командных Атрибутов
- У игрока много атрибутов
Это может упростить некоторые части нашего приложения. Сама модель команды для проверки и тому подобного. Вам нужно решить, какие атрибуты являются общими, а какие динамическими, например, имя, вес, рост являются общими, потому что они есть у всех игроков, поэтому они могут быть внутри вашей модели 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 — с небольшими изменениями):
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
person
gmaliar
schedule
03.04.2013