Rails ActiveRecord按联接表关联计数排序
技术问答
263 人阅读
|
0 人回复
|
2023-09-14
|
我有一个Resource模型可以使用“使行为成为现实”宝石(Github页面)进行投票。投票系统工作正常,但我尝试显示按votes每个页面有多少排序的页面Resource。9 ]: G4 s) r0 ^2 Z
目前,我的控制器根据标签提取资源,但未排序:1 c2 y8 W- G# \5 D
@resources = Resource.where(language_id: "ruby")
* g0 @( B {$ D! ~8 {如果我使用单个资源并调用“ @9 e$ R) f9 E% g' u
resource.votes.size”,它将返回其拥有的票数。但是,票数是另一张桌子,因此我认为需要进行某种形式的合并,但我不确定如何进行。我需要的是一个ActiveRecord可以这样显示的漂亮的有序集合?
$ f# a) w1 P4 T
+ E4 ~3 d& {, D: y' J书名-19票5 ?+ n! A9 g& c9 U
书名-15票: b# I# V7 y; L8 B+ Q
书名-9票
. o B, n S5 b* z! L8 ~书名-8票% A) {% [' E( J- G; z
# E/ ^) M, g0 ?/ a4 k5 ~9 y - t* _& i5 l9 l$ T, z0 ]: [
解决方案:
* F6 P7 ~9 I) k) w; L* y
% D7 h$ K2 P8 G2 m- R/ {
/ ^4 e, u* w& Y: E/ \
7 Q- Y3 S: Y7 W v# ]; y9 i1 K4 R" i 请尝试以下方法:
1 n L: P9 t! T, ^@resources = Resouce.select("resources.*, COUNT(votes.id) vote_count")
, Y6 H5 K/ B6 z7 W4 p& C8 n: p .joins(:votes)% ]- ]0 q6 W1 A, c7 S" S) i. j" h
.where(language_id: "ruby")7 ]. P. P1 k/ e# X& q
.group("resources.id")5 x& S3 |* J$ M8 v1 Z
.order("vote_count DESC")2 k( J+ y' o0 P& x4 c+ p5 L
@resources.each { |r| puts "#{r.whatever} #{r.vote_count}" }2 p3 ~3 C9 y6 e7 F% ]
要包含0票的资源,请使用外部联接。如果下面的示例不起作用,则必须更改joins语句以跨正确的关系进行联接。
3 k0 W+ c) |# v8 L@resources = Resource.select("resources.*, COUNT(votes.id) vote_count")3 }5 n* q# q& P; \6 E9 v h
.joins("LEFT OUTER JOIN votes ON votes.votable_id = resources.id AND votes.votable_type = 'Resource'")+ Y0 i, @; B! }* S; m
.where(language_id: "ruby")! I2 s- s6 g5 [/ T1 U
.group("resources.id")
) l3 J' l! D2 \4 w2 |) s# C: v .order("vote_count DESC") |
|
|
|
|
|