Rails 3 Модельные ассоциации с has_many, shares_to и: through - PullRequest
0 голосов
/ 11 ноября 2010

Я пытаюсь собрать пару ассоциаций моделей для небольшого проекта, над которым я работаю. Я новичок в Rails, так что меня это немного смущает.

Мой пример использования довольно прост. У меня есть Спортивная Лига , в которой много Дивизий . Каждый Дивизион имеет множество Команд . Каждая команда имеет по одному капитан и имеет много игроков .

Теперь и игроки, и капитаны представлены пользователем класса. Единственное, что их отличает, это их роль. Я использую CanCan для управления ролями.

Теперь вот мои Модели и как я определил ассоциации:

class Division < ActiveRecord::Base
  belongs_to :league
  has_many :teams
end

class League < ActiveRecord::Base
  has_many :divisions
end

class Team < ActiveRecord::Base
  belongs_to :division
  accepts_nested_attributes_for :division

  has_one :captain, :class_name => "User"
  accepts_nested_attributes_for :captain

  has_many :rosters
  has_many :players, :through => :rosters, :source => :user
  accepts_nested_attributes_for :players

  validates_presence_of :name
  validates_uniqueness_of :name
end

class User < ActiveRecord::Base
  has_many :authentications
  has_many :rosters
  has_many :teams, :through => :rosters
  belongs_to :team
end

А вот и мой сгенерированный файл схемы.

  1. Правильно ли я определил ассоциации моделей?
  2. Как мне назначить игрока или капитана в команду, когда я создаю или редактирую команду?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 11 ноября 2010
  1. Определение мне кажется нормальным. Есть и другие способы сделать это (конечно), но этот кажется нормальным.

  2. Этот тип зависит от вашего пользовательского интерфейса. Капитан должен быть достаточно простым - сделать collection_select и присвоить его атрибуту captain.

Игроки немного сложнее. Обычный подход (как и вы) заключается в использовании collection_select с html-массивом name (например, team[player_id][]), и в вашем случае я предполагаю, что у вас есть установленное количество игроков для каждой команды, поэтому вы просто отображаете много раз (если нет, вы можете использовать javascript, чтобы клонировать его для пользователя).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...