【问题标题】:How to create multiple relations between the same models如何在相同模型之间创建多个关系
【发布时间】:2012-05-18 12:39:01
【问题描述】:

我有一个用户模型

class User < ActiveRecord::Base
  has_many :projects
end

我有一个项目模型

class Project < ActiveRecord::Base
  belongs_to :user
end

显然,现在每个项目都归一个用户所有,每个项目只能有一个用户。我现在想让我的模型代表两个模型之间的另一种关系。我希望用户能够关注多个项目,无论谁拥有该项目。我知道我将不得不使用 has_many :through 并创建一个连接,但我无法理解如何更改模型以保持我当前的关系并添加新的关系。

【问题讨论】:

  • 当您说“关注多个项目”时,您的意思是用户对他们不拥有的项目具有只读权限吗?
  • 我希望用户能够查看他们有兴趣查看的项目的只读列表,除非他们当然拥有该项目。在这种情况下,他们仍然可以编辑项目。

标签: ruby-on-rails activerecord models


【解决方案1】:

那么,在这种情况下,在您的显示/索引操作中显示您的项目表中的所有项目 (Project.all)。这样,所有用户都可以访问所有项目。现在,在您的编辑操作中,使用user.projects.all 显示该特定用户的项目。那应该可以解决您的问题,我认为这里不需要任何进一步的关联。

更新:
这应该足够了:

class Project &lt; ActiveRecord::Base
belongs_to :user

class User &lt; ActiveRecord::Base
has_many :projects_followed, :through =&gt; :projects
user has_many :projects_owned, :through =&gt; :projects

如果您不想再创建两个关系,则只创建一个:
class ProjectsSubscribed
belongs_to :project
包含三个字段:project_id、is_owned、is_followed

【讨论】:

  • 用户与项目有两种不同的关系。他可以是所有者,也可以是追随者。
【解决方案2】:

尝试以下关系。

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

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

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

注意: 如果您需要将关系模型作为独立实体使用,则可以使用 has_many :through 关系。如果您不需要对关系模型做任何事情,那么设置 has_and_belongs_to_many 关系可能会更简单。

希望对您有所帮助。

【讨论】:

  • 原来一个用户有多个项目,一个项目只能有1个用户的关系呢?那已经不存在了。
  • 您可以使用另一个模型 projects_owned 来维护旧关系。它具有 project_id 和 user_id(表示属于_to 关系)。用户 has_many 到 project_owned 并且项目 has_one 到 project_owned。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多