根据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
值作为 NULL
。 NULL
s 是特定值,应单独处理,可能会导致降序问题,因为它们在 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
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
值作为 NULL
。 NULL
s 是特定值,应单独处理,可能会导致降序问题,因为它们在 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