0

我有模型User,,,TeamDocument用户和团队之间存在多对多关系,团队和文档之间存在多对多关系,分别使用称为TeamMembership和的连接表TeamDocument

我的模型中的关系如下所示:

class Document < ActiveRecord::Base
  has_many :team_documents, dependent: :destroy
  has_many :teams, through: :team_documents
end

class User < ActiveRecord::Base
  has_many :team_memberships, dependent: :destroy, foreign_key: :member_id
  has_many :teams, through: :team_memberships
  has_many :documents, through: :teams
end

class TeamDocument < ActiveRecord::Base
  belongs_to :team
  belongs_to :document
end

class TeamMembership < ActiveRecord::Base
  belongs_to :team
  belongs_to :member, class_name: "User"
end

class Team < ActiveRecord::Base
  has_many :team_documents, dependent: :destroy
  has_many :documents, through: :team_documents
  has_many :team_memberships, dependent: :destroy
  has_many :members, through: :team_memberships
end

这个想法是用户可以属于多个团队,一个文档可以与多个团队相关联,并且用户只能访问“属于”用户所属的至少一个团队的文档。

问题是:我可以User#documents用来检索允许该用户查看的所有文档的列表。但是,如果用户所属的多个团队可以查看文档,这将返回重复项。我怎样才能避免这种情况?

我知道我可以在事后使用 删除重复项@user.documents.uniq,但是由于无论如何我都不想包含重复项,有没有一种方法可以让我每次#documents都不包含重复项?

4

2 回答 2

1

我没有has_many :through像你那样嵌套来测试它,但我怀疑uniq在你的用户关联上使用选项会有所帮助:

class User < ActiveRecord::Base
  has_many :documents, through: :teams, uniq: true
end
于 2013-09-19T09:29:50.733 回答
0

您可以在 Document 模型上添加 default_scope:

class Document < ActiveRecord::Base

default_scope group: { documents: :id }
于 2013-09-19T09:06:58.213 回答