Rails

複数のパラメーターを使ってソートする方法が分からず、めちゃくちゃハマった

2+

複数のパラメーターを使ってソートする方法が分からず、めちゃくちゃハマった。
そもそも、なぜ複数のパラメーターを使ってソートしようと思ったかと言うと、ブログ等でよく見る「次の記事へ」「前の記事へ」といったページングを実装した際に、1つのパラメーターでソートしてしまうと、うまく実装できなかったからだ。
また、ページングのための場合分けをきちんと理解できていなかったことも相まって、どハマリしてしまった。

前提

テーブルのイメージ

id tweet date(営業日) created_at updated_at
1 hoge 2019-04-14 2019-04-14 09:00 2019-04-14 09:00
2 hogehoge 2019-04-15 2019-04-15 09:00 2019-04-15 09:00

ビューのイメージ

もともと実装していたページングのためのコード(model)

上記のようなコードで、ページングを実装してしまうと、dateが同じtweetが複数存在した時に、どのtweetが「次」もしくは「前」に表示されるかが不定な状態になってしまう。
それに、「”date > ?” , self.date」としているので、dateが同じtweetが複数あった場合に、その中の1つにしか遷移せず、「次」「前」のリンクを押しても、dateが同じ残りのtweetが見れない状態になってしまった。これを解消するのに、かなり時間がかかった。

ページングのための場合分けの考え方

大前提として、一意のレコードを必ず取得することができるように、ソートの数を増やしました。もともとは「date」だけをソートにしていましたが、これだと「date」が同じtweetが出てきた時に、ソートしても一意にtweetを特定することができません。
なので、今回は「date」「created_at」「id」の3つ(複数)のパラメーターを使ってソートをかけることで、一意のtweetを表現できるようにしました。そして、気になる場合分けの考え方は、下記の写真の通りです。

dateが4月13日で同じtweetが3つあると仮定しています。そして、それぞれのtweetを取得するための条件をレコードの横に書いています。このように紙に書き出していくと、とても分かりやすく頭の中が整理されました。後は、これをコードに落とし込んでいきます。

最終的なコード

モデルのコードを下記のように記述することで、3つ(複数)のパラメーターを使ったソートをかけることができ、結果として上手くページングをすることができました。

 

2+