多个has_many通过相同的模型轨道

时间:2017-03-23 17:34:47

标签: ruby-on-rails relationship nested-attributes has-many-through has-and-belongs-to-many

我正在尝试设置具有User model Project模型的模型结构以及设置为has_many的两个连接表来管理Project,ProjectManagers和ProjectMembers的两个特定方面。

我可以设置两个has_and_belongs_to_many,但它并不感觉很困难。

现在,这就是我所拥有的,而且我不确定如何继续使用多个has_many到(项目经理,项目成员)都引用用户模型。

即使项目经理不会总是成为项目用户表的一部分,嵌套是否仍然可行?

project.rb

class Project < ApplicationRecord
  has_many :project_members
  has_many :users, through: :project_manager
end

user.rb

class User < ApplicationRecord
  has_many :project_managers
  has_many :users, through: :project_managers
end

project_manager.rb

class ProjectManager < ApplicationRecord
    belongs_to :project
    belongs_to :user
end

project_member.rb

class ProjectMember < ApplicationRecord
  belongs_to :project
  belongs_to :user
end

1 个答案:

答案 0 :(得分:1)

我没有看到你正在做什么的任何问题。还有其他选择,但这种方法应该按照您的意愿工作。你试过吗?我会做这样的事情。

class Project < ApplicationRecord
  has_many :project_members
  has_many :project_managers

  has_many :members, through: :project_members, :class_name => User.to_s
  has_many :managers, through: :project_manager, :class_name => User.to_s
end

另一种方法,因为连接表类似,所以将它们子类化并将类型列添加到连接表中。不一定比你正在做的更好。

您还可以创建project_users表(不要将成员和经理分开)并包含“角色”列。 project_user.rb上的范围会带回经理或成员。

就个人而言,我会采用你的方法。经理可能会有不同的身份验证并与其他对象建立关系。查询更简单,不太可能犯错误。

并且,我不建议使用has_and_belongs_to_many,您可能会在连接表中添加其他列,并且您会很高兴您拥有该模型。