나는 여분의 조회 수를 줄이고 싶다.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)
먼저 다음과 같이 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.rbclass 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
여러 가지 옵션이 있는 것 같습니다. 자세히 알고 싶으신 분은 공식 문서를 보십시오.기타 감상 등
이번 시행 전에 N+1 문제도 발생했고 그 해결 방법도 참고로 공유했다.
앞으로 SQL을 열심히 공부하고 싶습니다.
Reference
이 문제에 관하여(나는 여분의 조회 수를 줄이고 싶다.counter_연구캐치에서counter까지_culture가 배치될 때까지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tanutanu/items/e5399f113360e05032e0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)