我有模型User
,Team
,Document
。用户和团队之间存在多对多关系,团队和文档之间存在多对多关系,分别使用名为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
删除重复项,但由于我从不想要在任何情况下都包含重复项,我是否有办法{ {1}}每次都不包括重复项?
答案 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 }