表示させる順番を並び替えよう
フリマアプリの商品一覧表示機能の実装の条件の中に 『出品された日時が新しい順に表示されること』 とあります。
現状のままでは出品された日時の古い順になっています。 直近の出品商品が一番最後に表示される感じです。
これを表示の時に並び替えるのではなく、情報取得時に並び替える方法があります。
order メソッド
データベースから取り出すレコードを特定の順序で並べ替えたい場合は、orderメソッドが使えます。 今回は日時順に並び替えたいので、created_atカラムを指定します。
コントローラーに記述します。
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で『ヤンキー君とメガネちゃん』が視聴可能です。 初めて見るんですけど、おもしろい!
何も考えずに見ることができるのと、よくよく見ていると出演者たちが名だたる顔ぶれで、それだけでも興味津々。 けっこう有名どころがが出ています。 見たことない―、という人はぜひ。