Отношения ActiveRecord, когда модель имеет как одну, так и несколько одинаковых моделей

Мои данные похожи на это:

class Team < ActiveRecord::Base
  has_many :persons
  has_one :leader
end

class Person < ActiveRecord::Base
  belongs_to :team
end

Человек принадлежит только к одной команде, но из множества членов команды есть только 1 лидер.

Первый вопрос: следует ли использовать own_to вместо has_one в модели Team?

Во-вторых: Команда состоит из множества Лиц и лидера, известного изначально. Как это сделать?

В настоящее время я делаю что-то подобное в своем контроллере:

  @team = Team.new

  for (each new person as p)

    new_person = @team.persons.build
    new_person.name = p.name

    if p.is_marked_as_leader
      @team.leader = new_person
    end
  end

  @team.save

Это проблема, когда я перечисляю @ team.persons, @ team.leader имеет первый идентификатор, я предполагаю, потому что @ team.save сначала сохраняет ассоциацию лидера. Мне нужно, чтобы они были в том порядке, в котором они предоставлены.

Спасибо!


person emery    schedule 20.07.2010    source источник
comment
Пожалуйста, измените заголовок вашего вопроса на более содержательный.   -  person Darin Dimitrov    schedule 20.07.2010
comment
Плохо, я только что редактировал. Не хотел так писать.   -  person emery    schedule 20.07.2010
comment
проголосуйте за повторное открытие, прежде чем op создаст новый.   -  person OscarRyz    schedule 20.07.2010
comment
Я добавил проблему с моим творением в контроллер. Я забыл упомянуть об этом.   -  person emery    schedule 20.07.2010
comment
Не могли бы вы снова открыть вопрос? Это законно, мне просто пришлось отредактировать. Выложил досрочно.   -  person emery    schedule 20.07.2010


Ответы (1)


Я бы проголосовал за has_one для лидера, потому что вы, человек, можете существовать вне команды и ее роль в качестве руководителя группы.

Это обсуждение агрегации против композиции.

Иногда это открыто для обсуждения, но в данном случае я бы сказал, что отношения между командой и лидером - это явно композиция.

person Peter Tillemans    schedule 20.07.2010
comment
Да вообще-то человек не может существовать вне команды и своей роли. Контент в реальном использовании - это скорее моментальный снимок состояния этой команды во времени, поэтому человек представляет состояние внешней сущности. Могу ли я перевернуть ваш ответ, чтобы предположить, что по той же причине он должен быть own_to? - person emery; 20.07.2010
comment
Как я уже сказал: это старое обсуждение A vs C ;-). Позвольте мне сказать по-другому: если вы удалите команду, вы удалите человека, который является ее лидером? Это тест, позволяющий отличить A от C. - person Peter Tillemans; 20.07.2010
comment
Да, я бы их удалил. Спасибо :) - person emery; 20.07.2010