1

我有 3 个模型PlayerDetailHero。APlayer有很多Details,aDetail属于a Hero。现在我想检索玩家玩过的所有英雄。到目前为止,我想出了这个。

Hero.where("id IN (SELECT hero_id FROM details WHERE player_id = 1)").group("id")

我将如何为它编写一个范围,以便我也可以将 Player 传递给范围?这是我到目前为止得到的,但它只对Details. 我还想数Hero一下,最后我有 x 倍 Hero1,x 倍 Hero2 等等。

scope :heroes, ->(player)  { where('player_id = ?', player.id).group("id") }

此范围在Detail模型中。我不知道这是否是最好的地方,因为我希望它返回Heroes而不是返回Details

4

2 回答 2

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) }

也许这不是最好的解决方案,但它完全符合我的要求。

于 2013-09-13T14:33:31.163 回答
1

我认为你只需要使用has_many :throughorhas_and_belongs_to_many,所以如果你使用:

player.heroes

这将带来与该玩家相关的所有英雄。如果你不需要重复的英雄,你可以使用

player.heroes.uniq

现在,关于总结每个英雄,也许你想总结每个英雄有多少细节?如果这不是你想要的,请更好地解释它。

于 2013-09-12T20:17:16.287 回答