次のような 3 つのモデルがあります (質問にとって重要なものを残しました)。
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 の場合は誰かがニーモニックに反対票を投じたことを意味します。
得票差上位3位までのニーモニックを取得したいと思います。データベースに 5 つのニーモニック レコードがあり、次の数の賛成/反対票があるとします (:vote_up フィールドとして true/false を持つ MnemonicVote レコード)。
mnemonic up down total
mnemonic1 3 2 1
mnemonic2 17 3 14
mnemonic3 2 5 -3
mnemonic4 11 7 4
mnemonic5 5 5 0
次の 3 つのニーモニック (カウント付き) を降順で取得したいと思います。
mnemonic2 14
mnemonic4 4
mnemonic1 1
私はこの実際のコードを書いて、私が望む結果を得ましたが、それがひどいことを認識しており、特定のニーモニック レコードに関連付けられたすべての MnemonicVote レコードがフェッチされた後にデータがグループ化およびソートされるため、その方法が好きではありません。 DB:
@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) クエリを使用して同じ結果を得たいと考えています。これはどのように達成できますか?ありがとう。