假设我有以下关联:
class Player
has_many :team_members
has_many :teams, through: :team_members, dependent: :destroy
has_many :invites, class_name: 'Invitation', as: :invitee
end
class Team
has_many :team_members
has_many :players, through: :team_members, dependent: :destroy
has_many :invites, class_name: 'Invitation', as: 'invitee'
has_many :invitations, as: :inviter
end
class Invitation
belongs_to :inviter, polymorphic: true, optional: true
belongs_to :invitee, polymorphic: true, optional: true
end基本上,Team和Player都可以被邀请,比方说,一个游戏,一个Player创建并拥有一个团队。因此,当Player登录时,我希望显示Player收到的邀请以及该Player拥有的任何Team收到的任何邀请。
我正在寻找类似这样的东西:
player = Player.first
player.invites << player.teams.invites但是我不能这样做,因为player.teams.invites返回了一个不匹配的类型,因为它返回的是Team而不是Invitation
在最少的查询次数中返回关联和关联关联的有效方法是什么?我知道我可以写一个循环,但我想知道是否有更优雅的东西。
发布于 2019-08-15 08:02:04
如果我是你,我想我会这样做:
class Invitation
belongs_to :inviter, polymorphic: true, optional: true
belongs_to :invitee, polymorphic: true, optional: true
class << self
def for_teams(teams)
where(invitee_type: 'Team', invitee_id: teams)
end
end
end然后,您可以执行以下操作:
Invitation.for_teams(player.teams)并返回任何球队收到的所有邀请,其中该球队的成员是该球员。
顺便说一句,我认为你的invites联想是错误的。我认为它们应该是:
class Team
has_many :team_members
has_many :players, through: :team_members, dependent: :destroy
has_many :invites, class_name: 'Invitation', as: :invitee
has_many :invitations, as: :inviter
end
class Player
has_many :team_members
has_many :teams, through: :team_members, dependent: :destroy
has_many :invites, class_name: 'Invitation', as: :invitee
end现在,您可能会得到不正确的结果,因为在has_many调用中忽略了invitee_type。
https://stackoverflow.com/questions/57503199
复制相似问题