나는 여분의 조회 수를 줄이고 싶다.counter_연구캐치에서counter까지_culture가 배치될 때까지

발생한 문제


Rails로 Instagram 패러디 앱을 만들고 있어요.
데이터베이스 구조는 이렇다.

이 응용 프로그램의 첫 페이지 (투고 일람) 에 이런 메일을 설치했다
  - if post.images.count >= 2
    - # 処理
조회가 이렇게 되었습니다^^;

images의count대량회전...^^;
그러고 보니 레일스의 기본 기능은 counter_cache 이라고 들었는데, 이럴 때 유용하다고 해서 조사해 본 것이 이번 시작이었습니다.
또한 실행 환경은 다음과 같다.
  • Rails 5.2.3
  • Ruby 2.6.0
  • counter_캐치 정보


    우선, 상술한 문제를 해결하는 수단으로 삼다

  • 사용counter_cache(Rails의 기본 기능)

  • counter_culture 사용(gem)
  • gorigori 코드 쓰기
  • 세 가지.세 번째는 가르쳐줬어요! 고마워요!!!
    먼저 다음과 같이 Rails의 기본 기능counter_cache을 구현합니다.
    models/image.rb
    class Image < ApplicationRecord
      belongs_to :post, counter_cache: true
    end
    
    종속이 있는 모델에 설명counter_cache: true.
    models/post.rb
    class Post < ApplicationRecord
      has_many :images
    end
    
    has_many의 모형은 원형을 유지하고 여기서 子テーブルの名前_count의 열을 만든다.이번의 경우 images_count 표에서 posts 라는 열을 만든다.
    $ rails g migration AddColumnToPost images_count:integer
    
    이렇게 하면 images_count열은post가 가지고 있는 이미지의 수량을 기록합니다.
    보기에서 이렇게 쓰면 images표를 일일이 호출하지 않고 조회수도 줄어든다...
    - if post.images_count >= 2
      -# 処理 
    
    ...여기까지 써서야 알아차렸다.만약 이미post의 데이터가 있다면 어떻게 해야 합니까...
    예, counter_cache의 약점이 바로 이렇습니다. 만약posts 표에 데이터가 있다면 images_count의 값은 자동으로 업데이트되지 않습니다.
    선인들이 힘들게 수정된 모습.도 찾았는데 구조가 너무 신비스러워서 익숙하게 사용할 수 없을 것 같아서...
    따라서 진일보한 조사에서 만난 것은 다음과 같다counter_culture.

    counter_cache


    또한 counter_cache에 대해서는 기본 열 이름 변경 등 다양한 옵션이 있습니다. 자세한 내용은 이쪽을 보십시오.
    Rails Guide-4.1.2.3:counter_cache

    counter_문화에 관하여

    counter_culture는 상술counter_cache의 약점도 강화할 수 있는 고기능gem이다.
    ▶공식 문서는 여기

    배포 방법


    gemfile migration


    배치 방법은 다음과 같다.우선Gemfile에 다음과 같은 내용bundle install을 기재한다.
    Gemfile
    gem 'counter_culture'
    
    그런 다음 다음 다음 명령을 사용하여 마이그레이션을 생성합니다.
    $ rails generate counter_culture Post images_count
    
    이 명령의 결과에 따라 다음과 같은 마이그레이션이 생성됩니다.
    XXXXXXXXXXXXXXX_add_images_count_to_posts.rb
    class AddImagesCountToPosts < ActiveRecord::Migration[5.2]
      def self.up
        add_column :posts, :images_count, :integer, null: false, default: 0
      end
    
      def self.down
        remove_column :posts, :images_count
      end
    end
    
    같은 구조를 가진 이전 파일이라면 명령으로 만들어야 하는 것이 아니다rails db:migrate.

    model


    모델 파일은 다음과 같습니다.
    models/image.rb
    class Image < ApplicationRecord
      belongs_to :post
      counter_culture :post
    end
    
    models/post.rb
    class Post < ApplicationRecord
      has_many :images
    end
    

    기타


    그리고 posts 테이블에 이미 많은 데이터 등이 있다면 컨트롤러에서 다음과 같이 실행합니다.
    $ rails c
    pry(main)> Image.counter_culture_fix_counts
    
    이것은 posts 표의 images_count 열의 내용을 업데이트합니다.
    마지막으로, 만약 당신이 보기에서 이렇게 쓴다면...
    - if post.images_count >= 2
      -# 処理 
    
    순조롭게 조회 수가 감소했습니다!!

    보충, 참고 자료 등

    counter_culture 여러 가지 옵션이 있는 것 같습니다. 자세히 알고 싶으신 분은 공식 문서를 보십시오.
  • counter_culture
  • 한편 이번에 참고한 보도는 다음과 같다.
  • Rails용 고성능 카운터 캐시 Gem'counter_culture'README(번역)
  • 관련 레코드 수 (카운터 캐시)
  • 기타 감상 등


    이번 시행 전에 N+1 문제도 발생했고 그 해결 방법도 참고로 공유했다.
  • Gembullet에 가입해 보세요. (N+1 문제를 눈치채지 못한 사람을 위해)
  • 조회 수를 줄이는 게 올해 목표 중 하나지만 SQL을 배우기 전에 빠르게 줄일 수 있는 방법을 찾게 되어 정말 좋습니다^^
    앞으로 SQL을 열심히 공부하고 싶습니다.

    좋은 웹페이지 즐겨찾기