Модельные отношения в Ruby on Rails - PullRequest
4 голосов
/ 26 апреля 2011

Я работаю над новым приложением в Rails 3, но я не уверен, как мне построить отношения между моделями.

В основном у меня есть model User и model Project. Пользователь может создать проект, став владельцем проекта. Но любой другой пользователь, кроме владельца проекта, может присоединиться и к этому проекту, но в качестве члена команды.

Нужно ли мне создавать новую модель для этих командных отношений? И как будут отношения между всем этим?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 26 апреля 2011

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

class User
  has_many :projects, :foreign_key => "owner_id"
  has_many :project_memberships, :foreign_key => "member_id"
  has_many :shared_projects, :class_name => "Project", :through => :project_memberships, :foreign_key => "member_id"
end

class ProjectMembership
  belongs_to :member, :class_name => 'User'
  belongs_to :project
end

class Project
  belongs_to :owner, :class_name => "User"
  has_many :project_memberships
  has_many :members, :class_name => "User", :through => "project_memberships", :foreign_key => "member_id"
end

По сути, это позволяет проекту иметь как владельца, который является пользователем, так и группу других участников, которые также являются пользователями, и к ним можно обращаться отдельно как таковые. Они связаны с использованием отношения has_many :through, и мы в основном даем более осмысленное имя, чем то, что нам дает значение по умолчанию has_many :users.

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

1 голос
/ 26 апреля 2011

Так что, составляя схему вашей модели, я ожидаю, что у вас есть следующее:

User --< UserProject >-- Project

Это означает, что пользователь может быть связан со многими проектами, а проект может быть связан со многими пользователями с 1 владельцем. Ваши таблицы будут иметь:

mysql> desc users;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

mysql> desc projects;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+

mysql> desc user_projects;    
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| user_id       | int(11) | YES  |     | NULL    |       |
| project_id    | int(11) | YES  |     | NULL    |       |
| project_owner | int(1)  | YES  |     | NULL    |       |
+---------------+---------+------+-----+---------+-------+

Ваши модели будут выглядеть так:

class User < ActiveRecord::Base
  has_many :user_projects
  has_many :projects, :through => :user_projects
end

class UserProjects < ActiveRecord::Base
  belongs_to :users
  belongs_to :projects
end

class Projects < ActiveRecord::Base
  has_many :user_projects
  has_many :users, :through => :user_projects
end

Этого должно быть достаточно, чтобы начать

1 голос
/ 26 апреля 2011

Проверьте это Руководство по рельсам об ассоциациях (отношениях).

Есть несколько способов настроить это каждый со своими плюсами и минусами. Прочитав приведенное выше руководство, вы получите достаточно хорошее представление о различных доступных вариантах.

Вы, вероятно, в конечном итоге получите ассоциацию "многие ко многим" (в проекте может быть много пользователей, а у пользователя может быть много проектов). Там у вас есть два основных варианта: has_and_belongs_to_many или has_many :through. Первый является наиболее «автоматическим», но последний предлагает больше контроля. Последнее мое личное предпочтение.

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

0 голосов
/ 26 апреля 2011

Похоже, что Project модель будет иметь как «own_to: user» (администратор проекта), так и «has_many: users» (участники).Я никогда не пробовал это лично, хотя.В то же время модель User будет более сложной.

В целом, мне кажется, имеет больше смысла устанавливать отношения «многие ко многим» между User и Project и «назначать» ролидля пользователей (например, администратор, участник и т. д.) для каждого проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...