我有3个模型,Player
,Detail
和Hero
。 Player
有Details
个,Detail
属于Hero
。现在我想要检索玩家玩过的所有英雄。到目前为止我想出了这个。
Hero.where("id IN (SELECT hero_id FROM details WHERE player_id = 1)").group("id")
我如何为它编写一个范围,以便我也可以将播放器传递到范围内?这是我到目前为止所得到的,但它只对Details
进行分组。我还想计算每一个Hero
所以最后我有x次Hero1,x次Hero2等等。
scope :heroes, ->(player) { where('player_id = ?', player.id).group("id") }
此范围位于Detail
模型中。我不知道它是否是最佳位置,因为我希望它返回Heroes
而不是Details
。
答案 0 :(得分:2)
好吧,经过一段时间后,我终于找到了如何让大多数人玩Heroes
一个范围。
scope :mostplayed, ->(player) { select('details.*, count(heros.id) AS hero_count').joins(:hero).where('player_id = ?', player.id).group('hero_id').order('hero_count DESC').limit(3) }
也许这不是最好的解决方案,但它完全符合我的要求。
答案 1 :(得分:1)
我认为你只需要使用has_many :through
or has_and_belongs_to_many
,所以如果你使用:
player.heroes
这将带来与该玩家相关的所有英雄。如果您不需要重复的英雄,可以使用
player.heroes.uniq
现在,关于每个英雄的总和相关,也许你想要总结每个英雄有多少细节?如果这不是你想要的,请更好地解释。