티스토리 뷰
해당 글은 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
'프로그래밍 공부 > Ruby on Rails : Gem' 카테고리의 다른 글
Ruby on Rails : Devise 로그인 Form 변경하기 (0) | 2019.11.05 |
---|---|
Ruby on Rails : 게시물 삭제 기록 남기기 [Gem : paranoia] (0) | 2019.11.05 |
Ruby on Rails : DB 구조를 한눈에 [Gem : rails_db] (0) | 2019.11.05 |
Ruby on Rails : 구글 연동 로그인 API [Gem : omniauth-google-oauth2] (2) | 2019.11.04 |
Ruby on Rails : 페이스북 연동 로그인 API [Gem : omniauth-facebook] (0) | 2019.11.04 |