LoginSignup
6
5

More than 5 years have passed since last update.

Railsのランキング機能で得た知見

Last updated at Posted at 2018-05-07

前説

本日あまり進捗生み出せなかったので、記事は少なめです。
今日はDockerの勉強とランキング機能を少し実装しました。
今回はあくまで自分の備忘録です。

実装内容

Rails 4.2
デザインは未完成ですが、いいねの数を集計してランキングさせた機能です。
いいねに関してはこちらのリンク(前編)リンク(後編)

コード

スクリーンショット 2018-05-07 23.06.15.png

product_controller.rb
def ranking
    #ランキング機能
    # group(レコード配列)->order(レコード配列)->limit(レコード配列)->count(ハッシュ)
    @like_count_id = Like.group(:product_id).order('count_product_id DESC').limit(10).count(:product_id).keys

    #whereメソッドはidを整列させる作用があり、せっかく順番にしたのに意味がない
    @like_count_product = @like_count_id.map{|id| Product.find(id)}
    @like_count = @like_count_id.map{|id| Like.where(product_id: id).count}
 end

説明書き

着目していただきたいのは、「型」です。
プログラミングにおいてどの「型」で渡すのか、どの「型」を受け取るのかがメソッドを扱う上で重要です。

  • テーブルからgroupメソッドで指定したカラムを取得し、レコード配列に。
  • レコードをorderで順番に並び替えます。
    • orderの中身は'count_(カラム) (昇順or降順)'という意味があります。
  • limitでレコードを10個取得。
  • countはレコード配列で取得しますが、ここでいいね!の数を数えているそうです。
    -  orderとcountの順序で違和感を感じた方へ。order('count_(カラム) (昇順or降順)').count(:(カラム))は文法上の作法らしくcountメソッドはレコード配列で取得し、ハッシュで返す為このような順番になった。

whereメソッドとfind_byメソッド

メソッド 役割
where 条件に該当するモデルを複数取得
find_by 条件に該当するモデルを一つ取得

参考記事

orderで降順に取得した要素に対してwhereメソッドを用いると、要素を並び替えてしまいます。

今回は取得した配列をそのまま実行してくれるmapを用います。
mapメソッドはeachメソッドやselectメソッドに似ています。

終わりに

今回は少し勉強不足な箇所があるので、鉞あればよろしくお願いします。特にwhereメソッドのへん。

6
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5