1

Postモデルソート

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

原因あなたの記事のすべてではないが、その後の後NULLとしてvotes.point値を持つことになりますいくつかのレコードに参加票を持っています。 NULLは個別に処理する必要がある特定の値であり、PostgreSQLでデフォルトの昇順で最後にソートされるため、降順で問題を引き起こす可能性があります。 NULL票を持つレコードを持っているために、適切に私はその後票を持っていないすべての記事は、その定期的な数である0に等しいtotal_point値を持つことになります0

SUM(COALESCE(votes.point, 0)) 

NULL値を強制することをお勧めソートあなたが望むように注文することができます。

また、PostgreSQLには、ORDER BY句でどのように値をソートするかを指定するための構文が追加されています(NULL)。 https://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-ORDERBY 例:

ORDER BY somevalue DESC NULLS LAST