我有三个模型看起来像这样(我刚刚把重要的东西留给了问题):
class Symbol < ActiveRecord::Base
has_many :mnemonic
end
class Mnemonic < ActiveRecord::Base
belongs_to :symbol
has_many :mnemonic_votes
end
class MnemonicVote < ActiveRecord::Base
belongs_to :mnemonic
attr_accessible :vote_up
end:vote_up是布尔型的,如果为true,表示有人投了助记符,如果为false,则表示有人投了反对票。
我想通过投票差异来获得前三名助记符。假设数据库中有5条助记符记录,其上/下投票数如下(MnemonicVote记录为:vote_up字段的true/false ):
mnemonic up down total
mnemonic1 3 2 1
mnemonic2 17 3 14
mnemonic3 2 5 -3
mnemonic4 11 7 4
mnemonic5 5 5 0我想按降序得到以下三个助记符(有计数):
mnemonic2 14
mnemonic4 4
mnemonic1 1我编写了这段实际的代码,给出了我想要的结果,但我知道这很糟糕,我不喜欢我是如何做到的,因为在从DB中获取了与certaing Mnemonic记录关联的所有MnemonicVote记录之后,数据就会进行分组和排序:
@mnemonics = Mnemonic.where(symbol_id: self.id) # here I fetch all Mnemonics associated with Symbol table
@mnemonics.sort_by { |mnemonic| mnemonic.votes_total }.reverse!
return @mnemonics.take(3)其中mnemonic.votes_total是Mnemonic对象上的计算属性。我希望通过使用单个AR (甚至SQL)查询来获得相同的结果。如何才能做到这一点?谢谢。
发布于 2013-09-14 06:29:35
这两个答案都在正确的轨道上,除了不适用于PostgreSQL的IF子句(我将得到函数if(布尔值、整数、整数)不存在)。这是我的最后一个解决方案,以防有人需要它:
Mnemonic.
select("mnemonics.*, SUM(CASE WHEN mnemonic_votes.vote_up THEN 1 ELSE -1 END) AS votes_total").
joins(:mnemonic_votes).
where(symbol_id: self.id).
group("mnemonics.id").
order("votes_total DESC").
limit(3)发布于 2013-09-13 23:00:52
我相信这就是你想要的:
Mnemonic.
joins(:mnemonic_votes).
select("mnemonics.*, SUM(IF(mnemonic_votes.upvote, 1, -1)) AS vote").
group("mnemonics.id").
order("vote DESC").
map { |m| [m.symbol, m.vote.to_i] }https://stackoverflow.com/questions/18796232
复制相似问题