表示させる順番を並び替えよう

フリマアプリの商品一覧表示機能の実装の条件の中に 『出品された日時が新しい順に表示されること』 とあります。

現状のままでは出品された日時の古い順になっています。 直近の出品商品が一番最後に表示される感じです。

これを表示の時に並び替えるのではなく、情報取得時に並び替える方法があります。

order メソッド

データベースから取り出すレコードを特定の順序で並べ替えたい場合は、orderメソッドが使えます。 今回は日時順に並び替えたいので、created_atカラムを指定します。

railsguides.jp

コントローラーに記述します。

def index
    @items = Item.all.order("created_at DESC")
end

これで出品された日時の新しい順に表示されるようになります。

補足情報 N+1問題を考える

N+1問題とは、アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題です。

userテーブルとitemテーブルがそれぞれ以下のようにアソシエーションで関連付けされているとします。

  • has_many :items
  • belongs_to :user

Item.all でデータを取得する場合は一度のアクセスで大丈夫なのですが、 トップページに一覧表示させる場合に出品者名も表示させるとすると、 userテーブルへもitemテーブルへアクセスするのと同じだけアクセスするようになります。

それぞれのデータ数が多ければ多いほどアクセス回数も多くなり、パフォーマンスの低下につながります。

この問題を解決するのに一役買うのが includesメソッド です。 このメソッドは、関連するモデルの情報をまとめて取得することができます。

def index
    @items = Item.inclues(:user).order("created_at DESC")
end

includesメソッド を使用することですべてのデータを取得できるので、allメソッドは省略することが可能です。

さあ、次は商品詳細表示機能の実装です。

たわいのないつぶやき

プログラミングとは全然関係ないんですけど、今、Tverで『ヤンキー君とメガネちゃん』が視聴可能です。 初めて見るんですけど、おもしろい!

何も考えずに見ることができるのと、よくよく見ていると出演者たちが名だたる顔ぶれで、それだけでも興味津々。 けっこう有名どころがが出ています。 見たことない―、という人はぜひ。