ポイント機能・レベルアップ機能　もらったいいね数をマイページで表示させたい！　非同期通信のいいね

<h2>初めに</h2>
ポイント機能というかレベルアップ機能というか・・・
Qiitaでもコントリビューションが増えるとやる気につながるので、
そういった機能を作成したいと思いました。
そんなわけで、自分の記事についたいいね数をマイページで出せるようにしていきます！！
やり方は通知機能と似ているなーと感じました。


![スクリーンショット 2021-08-26 18.03.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a194f111-476f-d4a9-ebc6-26e9c7abab42.png)
(TEUっていうのは、コンテナの数え方です。マニアック・・・）
ついでにこんなのも作れます！

![スクリーンショット 2021-08-26 18.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/b5b00502-fb5a-4f3f-0b75-60f50430ad70.png)


<h2>マイグレーションファイル、モデルファイル作成</h2>

```perl:00000000_create_points.rb
class CreatePoints < ActiveRecord::Migration[5.2]
  def change
    create_table :points do |t|
      t.integer :giver_id, null: false
      t.integer :getter_id, null: false
      t.integer :post_id, null: false
      t.timestamps
    end
  end
end
```

```perl:/app/models/point.rb 
class Point < ApplicationRecord
  belongs_to :post
  belongs_to :giver, class_name: 'User', foreign_key: 'giver_id', optional: true
  belongs_to :getter, class_name: 'User', foreign_key: 'getter_id', optional: true

  scope :created_today, -> { where(created_at: Time.zone.now.all_day) }
  scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) }
  scope :created_2days_ago, -> { where(created_at: 2.days.ago.all_day) }
  scope :created_3days_ago, -> { where(created_at: 3.days.ago.all_day) }
  scope :created_4days_ago, -> { where(created_at: 4.days.ago.all_day) }
  scope :created_5days_ago, -> { where(created_at: 5.days.ago.all_day) }
  scope :created_6days_ago, -> { where(created_at: 6.days.ago.all_day) }
```

```scope :created_today```等に関する記事

https://qiita.com/ki_87/items/cbfdb803355ba4e4fe55

```perl:user.rb
 # ポイント　ポイント与える側、もらう側で２通り
  has_many :active_points, class_name: 'Point', foreign_key: 'giver_id', dependent: :destroy
  has_many :passive_points, class_name: 'Point', foreign_key: 'getter_id', dependent: :destroy
```
①ポイントを送るユーザーと、
②ポイントを受け取るユーザーの２種類いますのでこのように分けて定義します。
今回だと、active_points
passive_pointsです。それぞれ分けて書いてるけど、
結局はPointとのアソシエーションなので、
class_name: 'Point',をつけてあげます。


```perl:post.rb
  has_many :points, dependent: :destroy
```

<h2>コントローラーで、いいねがついたら、ポイントがたまるようにする</h2>

```perl:controllers/favorite_controller.rb
  def create
    post = Post.find(params[:post_id])
    favorite = current_user.favorites.new(post_id: post.id)
    favorite.save
    @post = Post.find(params[:post_id])

    unless @post.user == current_user
      @post.point_by(current_user)
    end
  end
```
既に作成済のいいね機能に書き加えました！（自分の記事に「いいね」するのはOKにしてます）
ただし、自分の記事に「いいね」をしてもポイントは貯まらないようにしています！！！
また、「いいね」を外されても、ポイントは減らないようにしています。
（減るのは悲しいので！）

<h2>モデルファイルでポイントを保存</h2>

コントローラーから、@post.point_by(current_user)で、
current_userを引数として渡されています。

```perl:post.rb
 # ポイントの
  def point_by(current_user)
    point = current_user.active_points.new(
      post_id: id,
      getter_id: user_id
    )
    point.save if point.valid?
  end
```

ここで気づいたのですが、giver_idどこにも使ってない・・・ということです。。
要らなかったああーと思い、マイグレーションファイルやら、
アソシエーション消したら動かなくなりました。。
giverありきのgetterだからでしょうか。

<h2>マイページで表示する</h2>

```perl:users_controller.rb
 def show
    @user = User.find(params[:id])
    @posts = @user.posts.where(status: true).order('created_at DESC').page(params[:page]).per(20)
    @point = @user.passive_points.all
    @posts_tag = @user.tags.order('created_at DESC').limit(15)
  end
```

```perl:app/views/users/show.html.erb
<strong><%= @point.length %></strong> TEU</h3>
```

<h2>以上です！！</h2>

いいねポイントが１０になればLevel1とかそういう記述をすれば、
レベルアップ機能にもなるかな〜と思います！！！

獲得したいいね数をグラフにしたい方は以下の記事から

https://qiita.com/ki_87/items/6a0f8f3ee01c538bb75e