根据rails4中的关联点进行排序

时间:2016-08-17 05:01:06

标签: ruby postgresql associations rails-activerecord ruby-on-rails-4.2

发布模型

has_many :votes

投票模型

belongs-to :post

我需要从帖子表中获取所有帖子并显示。但是条目应该在其投票的ASC / DESC(params [:order])中排序。如果所有帖子都有投票表条目,则下面的代码可以完美运行。

我的查询如下:

@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]}")

但是,如果任何帖子没有投票表条目,那么未投票的帖子会使列表排序显示错误。如果对某些帖子没有投票,并且排序顺序是ASC,则需要首先在列表中显示未投票的帖子,并且 如果排序顺序是DESC,那么需要在列表中最后显示未投票的帖子。请帮忙。

由于

1 个答案:

答案 0 :(得分:2)

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

NULL

之后所有没有投票的帖子都会有NULL值等于0,这是一个可以按照你想要的顺序排列的常规号码。

或者,PostgreSql具有额外的语法,用于指定SUM(COALESCE(votes.point, 0)) 值应如何使用total_point子句进行排序。 https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-ORDERBY 例如:

NULL