Rails 4范围用于SQL语句

时间:2013-09-12 16:10:15

标签: ruby-on-rails ruby scope ruby-on-rails-4

我有3个模型,PlayerDetailHeroPlayerDetails个,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

2 个答案:

答案 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

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