Как запись может принадлежать одному пользователю, но также может иметь несколько «вторичных» пользователей? - PullRequest
0 голосов
/ 15 апреля 2010

В моем приложении есть модель User и модель Project. Пользователь имеет_ множество назначений, и каждый проект принадлежит_ пользователю. Но наряду с тем, что у каждого проекта есть владелец, пользователь, который его создал, я бы хотел, чтобы владелец мог поделиться им с другими (чтобы проект отображался в учетной записи других пользователей вместе с их собственной). Я представляю себе необходимость использования has_many: through и настройки таблицы projects_users с помощью user_id и project_id. И я думаю, это будет конечный результат?

Project.first.user
  # The creator of the project
  => #<User id: 1, name: 'andrew', etc...>

Project.first.users
  # The users that the creator chose to share it with
  => [#<User id: 2 ...>, #<User id: 3 ...>]

Я немного работал над этим и создал модель SharedProject со столбцами user_id и project_id:

class SharedProject < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
end

Я хотел бы вызвать и user.projects, и user.shared_projects, но я не знаю, как бы получить shared_projects для возврата записей проекта вместо записей из таблицы shared_projects. Я не могу выполнить has_many :projects, :through => :shared_projects с тех пор, как не смогу вернуть проекты, созданные пользователем.

class User < ActiveRecord::Base
  has_many :projects # Calling user.projects returns the projects that user created
  has_many :shared_projects # How to get user.shared_projects to return project records?
end

Ответы [ 2 ]

2 голосов
/ 15 апреля 2010

Вот как вы можете добавить поле владельца к вашей модели Project, а затем и коллекцию собственных проектов к вашей модели User. Вы можете использовать то, что у вас уже есть, для части общих проектов.

class User < ActiveRecord::Base
  has_many :owned_projects, :class_name => 'Project', :foreign_key => 'owner_id'
end
class Project < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'
end

Вам необходимо добавить столбец owner_id в таблицу projects.

0 голосов
/ 15 апреля 2010

Мне кажется, вы, возможно, захотите настроить модель ProjectShare.
Модель ProjectShare будет принадлежать пользователю (участнику), проекту принадлежащего (совместно используемому проекту) и has_many user_shared_with (просто другое имя класса для пользовательской модели)

Таким образом, вы можете видеть, кто именно поделился тем, с кем. Я думаю, что вы могли бы добиться того же с помощью has_many: сквозной ситуации, просто назвав свои модели соответственно.

...