has_many:通过或has_and_belongs_to_many或其他什么?

时间:2015-08-27 02:43:27

标签: ruby-on-rails ruby-on-rails-4 activerecord model-view-controller associations

我有一个项目和用户模型

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

class User < ActiveRecord::Base
    has_many :projects
end

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

我将如何建模?我目前只建立了提议者关系。这有点令人困惑,因为我还在学习更高级的协会。

2 个答案:

答案 0 :(得分:0)

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表格中user_idproject_id添加了一个额外的列role。此角色字段将定义user角色,是提议者还是通常只是拥有项目。

然后,如果您想找到项目提议者,那么project.project_users.where(:role => 'proposer')

答案 1 :(得分:0)

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

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

我有一个连接表Projectships,它拥有一个关系,然后我有直接的外键,没有连接表,它保存了提议者的关系。它似乎到目前为止工作。虽然我认为@Emu上面/下面的解决方案更好,但如果我遇到任何问题,我可以回过头来改变它。