Rails:忽略嵌套关联中的重复项

时间:2013-09-19 09:02:35

标签: ruby-on-rails ruby activerecord

我有模型UserTeamDocument。用户和团队之间存在多对多关系,团队和文档之间存在多对多关系,分别使用名为TeamMembershipTeamDocument的联接表。

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

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删除重复项,但由于我从不想要在任何情况下都包含重复项,我是否有办法{ {1}}每次都不包括重复项?

2 个答案:

答案 0 :(得分:1)

我没有像您这样的嵌套has_many :through进行测试,但我怀疑在您的用户关联中使用uniq选项会有所帮助:

class User < ActiveRecord::Base
  has_many :documents, through: :teams, uniq: true
end

答案 1 :(得分:0)

您可以在文档模型上添加default_scope:

class Document < ActiveRecord::Base

default_scope group: { documents: :id }