У меня есть модели 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)
но это казалось хакерским, и я был уверен, что они будут лучшим способом сделать это. Извиняюсь за свое невежество, если я упустил что-то простое.