has_many :through 或 has_and_belongs_to_many 或其他?

has_many :through or has_and_belongs_to_many or something else?

我有一个项目和用户模型

class Project < ActiveRecord::Base
    belongs_to :proposer, class_name: "User", foreign_key: :user_id
end

class User < ActiveRecord::Base
    has_many :projects
end

我希望有一个用户是项目提议者并拥有该项目。然后还有其他用户也拥有该项目。例如,User/proposer 将他们添加为所有者,但他们不是提议者。

我该如何建模?我目前只建立了proposer关系。这有点令人困惑,因为我仍在学习更高级的关联。

class Project < ActiveRecord::Base
    has_many :users, :through => project_users
    has_many :project_users
end

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

现在在您的 ProjectUser table 和 user_idproject_id 中添加一个额外的列 role。此角色字段将定义 user 角色,他是 提议者 还是通常只是 拥有 项目。

那么如果你想找到项目发起人,那么project.project_users.where(:role => 'proposer')

实际上我最终这样做了(不确定这是否是长期的好解决方案):

class Project < ActiveRecord::Base
  belongs_to :proposer, class_name: "User", foreign_key: :user_id
  has_many :propojectships
  has_many :users, through: :projectships
end

class User < ActiveRecord::Base
  has_many :projectships
  has_many :projects, through: :projectships
  has_many :projects
end

我有一个 join table Projectships 持有一个关系,然后我有一个直接外键,没有 join table 持有提议者关系。到目前为止它似乎有效。尽管我认为@Emu 的 above/below 解决方案更好,但如果我 运行 遇到任何问题,我可能会回来更改。