Рельсов много и принадлежит одному - PullRequest
12 голосов
/ 30 июня 2011

У меня есть модель User, которая имеет много projects и модель Project, которая может иметь много users, но также принадлежит одному пользователю (то есть пользователю, создавшему этот проект). Он должен принадлежать User. Это также позволяет списку пользователей быть связанным с ним, думаю, сотрудничество.

Учитывая это, мои модели выглядят так:

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

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :assigned_projects
  has_many :users, :through => :assigned_projects
end

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

Теперь, когда я хочу создать новый проект через User, я бы так и сделал:

user = User.create(:name => 'injekt')
user.projects.create(:name => 'project one')

Теперь я знаю, что projects предоставляется через AssignedProject модель соединения, поэтому project.user вернет nil. То, что я изо всех сил пытаюсь понять, это лучший способ назначить создателя проекта (которому, кстати, не нужно , нужно , чтобы быть user, это может быть creator или что-то еще описательное До тех пор, пока он имеет тип User).

Идея состоит в том, чтобы создать метод для возврата projects_created из User, который будет выбирать только проекты, созданные этим пользователем. Где user.projects, конечно, вернет ВСЕ проекты, с которыми связан пользователь.

Предполагая, что такого рода ассоциации довольно распространены, как лучше всего достичь того, чего я хочу? Любое направление очень ценится.

Ответы [ 2 ]

20 голосов
/ 30 июня 2011

Добавьте столбец creator_id в таблицу проектов для отношений создателя, а затем добавьте ассоциации к моделям:

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

  has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :assigned_projects
  has_many :users, :through => :assigned_projects

  belongs_to :creator, :class_name => "User", :foreign_key => :creator_id
end

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

1 голос
/ 26 февраля 2012

Я хотел добавить небольшое улучшение в дизайн.На самом деле нам не нужна промежуточная модель, потому что она не содержит никаких дополнительных столбцов, кроме reference_ids, поэтому здесь лучше всего подходит ассоциация HABTM.

class User < ActiveRecord::Base
  has_and_belongs_to_many :projects, :join_table => :assigned_projects
  has_many :created_projects, :class_name => "Project", :foreign_key => :creator_id
end

class Project < ActiveRecord::Base
  has_and_belongs_to_many :users, :join_table => :assigned_projects
  belongs_to :creator, :class_name => "User", :foreign_key => :creator_id
end
...