Rails HABTM и own_to для связывания пользователей / проектов - PullRequest
2 голосов
/ 27 июня 2011

У меня есть модели User и Project. Пользователь может иметь несколько проектов, а проект может иметь несколько пользователей. Это конечно просто с has_and_belongs_to_many ассоциацией. Моя проблема в том, что я также хотел бы отследить пользователя, который создал проект. Это было бы просто с belongs_to :user для моей Project модели. Проблема в том, что выполнение has_many :projects для User, когда пользователь уже имеет отношения HABTM с Project, не имеет большого смысла.

Вот чего я в конечном итоге хотел бы достичь:

# building a project with the currently logged in user
current_user.projects.build(...)

# now when a user wants to add another user to this project
project = current_user.projects.find(...)
project.users << User.find(...)

# grabbing information
some_project.user  #=> The user who created this project
some_project.users #=> The array of User objects associated
some_user.projects #=> The array of Project objects associated

В будущем, вероятно, User будет иметь такие же отношения с Group, где User будет иметь много и принадлежать ко многим группам. Но я также хотел бы отследить создателя этого Group.

Вполне вероятно, что я что-то упустил. Какой общий способ добиться этого?

Если это поможет уточнить, возможная конфигурация изложена ниже:

  • Группа
    • has_and_belongs_to_many: пользователи
    • принадлежит_: пользователь
    • has_many: проекты
    • Только у User должна быть возможность создать Group
  • Пользователь
    • has_and_belongs_to_many: группы
    • has_many: проекты
    • Может быть отличной группой или проектом, а также может принадлежать обоим
  • Проект
    • has_and_belongs_to_many: пользователи
    • принадлежит_ к группе: 1055 *
    • и User, и Group должны иметь возможность создавать Project

Я также пытался сделать простые has_and_belongs_to_many для каждой ассоциации, включая, например, creator_id, и отслеживать это сам. Например .. Project.create(:creator_id => current_user.id) но это казалось хакерским, и я был уверен, что они будут лучшим способом сделать это. Извиняюсь за свое невежество, если я упустил что-то простое.

1 Ответ

1 голос
/ 27 июня 2011

При повторном прочтении вы захотите иметь одного владельца проекта, группу или пользователя.Сохраните это как полиморфное отношение own_to из модели проекта.то есть.owner_type => 'User' / 'Group' owner_id => 123

Других пользователей, связанных с группой, много ко многим, поэтому вам нужна таблица объединения.

Модель вашей группы является отдельной модельюс отношениями «многие ко многим» с пользователями, так что вы можете просто сохранить пользователя, который его создал, как поле групповой модели, т.е.: user_id 123.

...