根据rails4中的关联点排序

Sort based on associated points in rails4

Post 型号

has_many :votes

给模型投票

belongs-to :post

我需要从 post table 中获取所有 post 并显示。但条目应按其投票的 ASC/DESC(params[:order]) 排序。如果所有 post 都有 Vote table 条目,那么下面的代码可以完美运行。

我有如下疑问:

@posts = Post.joins('LEFT OUTER JOIN votes ON votes.post_id = posts.id').select('posts.*, SUM(votes.point) AS total_point').group('posts.id').order("total_point #{params[:order]}")

但是,如果任何 post 没有投票 table 条目,则未投票的 post 会使列表排序出现错误。如果没有投票给某些posts,并且排序顺序是ASC,则需要在列表中首先出现未投票的posts,并且 如果排序顺序是 DESC ,则需要将未投票的 post 显示在列表的最后。请帮忙。

谢谢

因为并非您的所有帖子都有投票,所以加入后一些记录将具有 votes.point 值作为 NULLNULLs 是特定值,应单独处理,可能会导致降序问题,因为它们在 PostgreSql 中按默认升序最后排序。为了正确排序 NULL 投票的记录,我建议将 NULL 值强制为 0.

SUM(COALESCE(votes.point, 0))

之后所有没有投票的帖子的 total_point 值将等于 0,这是一个可以按您需要排序的常规数字。

或者,PostgreSql 有额外的语法来指定如何使用 ORDER BY 子句对 NULL 值进行排序。 https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-ORDERBY 示例:

ORDER BY somevalue DESC NULLS LAST