Rails имеет много и принадлежит одному
У меня есть модель User
, которая имеет много моделей projects
и Project
, которая может иметь много users
, но также принадлежит одному пользователю (то есть пользователю, который создал этот проект). Он должен принадлежать a 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
, конечно, вернет ВСЕ проекты, с которыми связан пользователь.
Предполагая, что такая ассоциация довольно распространена, какой лучший способ достичь того, что я хочу? Любое направление приветствуется.
Ответы
Ответ 1
Добавьте столбец 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
Ответ 2
Я хотел добавить небольшое улучшение в дизайн. На самом деле нам не нужна промежуточная модель, потому что она не содержит лишних столбцов, отличных от 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