前説
本日あまり進捗生み出せなかったので、記事は少なめです。
今日はDockerの勉強とランキング機能を少し実装しました。
今回はあくまで自分の備忘録です。
実装内容
Rails 4.2
デザインは未完成ですが、いいねの数を集計してランキングさせた機能です。
いいねに関してはこちらのリンク(前編)とリンク(後編)
コード
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メソッドのへん。