티스토리 뷰

 해당 글은 https://blog.naver.com/kbs4674/221042620689 로 부터 게시글이 이전되었습니다.

 

원래 처음에는 Gem의 힘을 빌리지 않고 조회수를 구현하려고 했는데 막 DB에 새로운 컬럼을 추가해서 순수적으로 해보려고 해보는데 잘 안되네요.. 거의 막판에 포기할 무렵...... 조회수 관련해서 전문적으로 기능을 담당하는 Gem 있다는걸 알게됩니다!

 

게다가 마침 IP대조까지 해서 조회수 증감 판단도 합니다! 이번엔 impressionist Gem에 대해서 소개하고자 합니다.

 

 

 

  • 조회수 기능 (IP Check 포함)

1. 예제 실습을 위해 scaffold를 생성합니다.

rails g scaffold post title content:text

 

2.  Gemfile  에 다음 내용을 추가합니다.

gem 'impressionist'

그리고 Gem을 설치합니다.

bundle install

 

3. Gem 설치 작업이 끝나면, 명령어 입력창(터미널)에 다음 명령어를 칩니다.

rails g impressionist

그러면  db/migrate/(기간)_impressions_table.rb  라는 새로운 테이블 파일과  config/initializers/impression.rb  파일이 생깁니다.

 

테이블 파일이 새로 생겼으니 Migrate를 진행해주세요.

rake db:migrate

 

4.  app/models/post.rb  에서 다음 내용을 추가합니다.

class PostsController < ApplicationController
    ...
  
    # 조회수 기록 기준 (액션 : show / 기준 : impressionable_id(데이터 ID값), IP주소)
    impressionist actions: [:show], :unique => [:impressionable_id, :ip_address]
 
    ...
end

 

5. 조회수가 노출되길 원하는 view에 가서 다음 변수를 추가함으로서, '조회수 출력' 변수를 추가합니다.

<%= 변수.impressionist_count %>

저는 위 코드를 Post scaffold에 다음과 같이 입혀보겠습니다.

<% @posts.each do |post| %>
	...
	<td><%= "#{post.impressionist_count} views" %></td>
	...
<% end %>

 

6. 결과를 확인해봅니다!

 

 

  • Impressionist Cache 컬럼 추가 및 조회수 높은 순으로 정렬하기

이번에는 조회수가 높은게 우선적으로 위로 올라가게 정렬을 해보겠습니다.

 

1. 다음 명령어를 입력해줍니다.

rails g migration AddImpressionsCountTo[모델명] impressions_count:int

저같은 경우는 Post 라는 이름의 게시판 모델명을 입력하겠습니다.

rails g migration AddImpressionsCountToPost impressions_count:int

테이블 파일로 뭔가 하나 생겨났습니다.

새로 생겨난 테이블을 스키마에 쓰고자 Migration 해줍니다.

rake db:migrate

 

2. 정렬을 하고자 하는 대상의 Model로 이동 후, 다음 내용을 추가해줍니다.

(저는  app/models/Post.rb 에 추가하겠습니다.)

class Post < ApplicationRecord
  ...
  is_impressionable :counter_cache => true, :unique => true
end

 

3. 정렬을 하고자 하는 대상의 Controller로 이동 후, 다음 내용을 추가해줍니다.

(저는  app/controllers/Posts_controller.rb  에 추가하겠습니다.)

class PostsController < ApplicationController
  ...
  def index
    ...
    @posts = Post.order("impressions_count DESC")
  end
  ...
end

 

4. 끝입니다!

결과를 보시면 조회수가 높은 순서대로 정렬이 되어 있을겁니다!

 

DB 테이블을 보면 새로운 컬럼 테이블 추가 및, 따로 조회수를 기록하고 있는것도 확인이 됩니다.

 

 

  • Impressionist 기타 이론

1) 각 조회수 데이터는 기본적으로 impressions 테이블에 담겨집니다.

 참고 

  • impressionable_type : 조회수(impression)가 기록된 모델 이름
  • impressionable_id : 조회수(impression)가 기록된 모델의 ID

 

2) 게시글 별 조회수 카운트는 기본적으로 impressions 테이블을 참고합니다.

서버 로그기록을 보면 동일한 impressioniable_id(어떤 모델의 ID)가 동일한 총 갯수에 대해 count 함수를 사용해서 조회수 총 합을 나타내는 것을 볼 수 있습니다.

 

3) Impressions counter(Cache) 컬럼

Impressionist Cache 컬럼 등록 및 SQL Update&Count는 조회수가 올라갈 때만 작동됩니다.

새로운 방문자가 게시물 열람 (새로 조회수가 등록될 경우)
과거에 방문했던 사람이 또 게시물을 열람 (조회수가 이미 등록 된 경우)

또한 Impressionist Cache 컬럼는 중간에 도입되더라도, 새로운 방문자가 게시물을 열람 시 최신 조회수 counter이 impressions count 컬럼에 기록됩니다.

 

 

  • 자료 참고

1. Github - impressionist [클릭]

 

루비온 레일즈 Ruby on Rails ROR

댓글
댓글쓰기 폼
공지사항
Total
168,727
Today
25
Yesterday
264
링크
«   2022/01   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함