Rails: сложные отношения HABTM с 3 ключами? - PullRequest
0 голосов
/ 11 октября 2011

Я пытаюсь определить, сколько часов собраний проводит конкретная Организация, но это не так просто, как кажется, из-за определенных сложностей в отношениях.

class Meeting < ActiveRecord::Base
    has_and_belongs_to_many :people
end

class Person < ActiveRecord::Base
    has_any_belongs_to_many :meetings
    has_and_belongs_to_many :positions
end

class Position < ActiveRecord::Base
    has_and_belongs_to_many :people  # b/c over time more than one person
                        may hold this position over time
    belongs_to :organization
end

class Organization < ActiveRecord::Base
    has_many :positions
end

Поскольку люди могут менять позиции (и организации) с течением времени, когда кто-то посещает собрание, мне нужно также записать свою позицию в это время, чтобы подсчет был точным.*

В нынешнем виде, поскольку таблица соединения HATBM обрабатывается неявно (meeting_people), я не могу отслеживать позицию.Как мне добавить позицию в этот микс и как лучше написать запрос, чтобы получить общее количество часов собрания для каждой организации?

Заранее благодарим за любую помощь или совет, который вы можете предоставить!

1 Ответ

1 голос
/ 11 октября 2011

has_many :through позволяет использовать правильную модель соединения вместо подразумеваемой, например habtm. Вы бы сделали целый класс, который называется что-то вроде MeetingAttendance, где вы будете хранить собрание и посещать его. Затем вы можете поместить любые атрибуты в модель, которую вы хотите, включая position. Тогда просто

Person has_many :meeting_attendances
Person has_many :meetings, :through => :meeting_attendances
Meeting has_many :meeting_attendances
Meeting has_many :people, :through => :meeting_attendances

и

class MeetingAttendance < ActiveRecord::Base
  belongs_to :person
  belongs_to :meeting
end

Примечание: вам может понадобиться настроить это, так как я не уверен, как Rails обрабатывает множественное число "Person", но это общая идея.

Документация здесь

...