前説

本日あまり進捗生み出せなかったので、記事は少なめです。
今日は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メソッドのへん。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.