counter_캐치가 편할 줄은 몰랐어요.

10905 단어 Rails

개시하다


rails counter로캐치 있는 거 알아요.
지금까지 예를 들어볼게요.
rails g model user name:string 
rails g model star user:references
이렇게
사용자 스타의 수를 알고 싶을 때.
stars_count = Star.where(user_id: params[:id]).count
이렇게
그런데 카운터.캐치를 사용하면 스타가 만들어졌을 때 자동user란의 스타.count에 스타를 넣은 수량.

사용법


models/user.달성
user.rb
class User < ApplicationRecord
    has_many :stars
end
models/star.달성
star.rb
class Star < ApplicationRecord
    belongs_to :user, :counter_cache => true
end
.
이만 마치겠습니다.
겸사겸사 말씀드리지만, 사전에 user에서 stars를count라는 열을 만들어야 합니다.
또 스타즈.count 대신 다른 열 이름을 사용하려면 선택하십시오
:counter_cache => true
열다
counter_cache: :sample_count
그러면 오케이.

시용하다

rails g model user name stars_count:integer
rails g model star 
rails db:migrate
rails c
user = User.create(name: "counter")
100.times {user.stars.create}

省略

"2019-02-07 12:03:41.796608"], ["updated_at", "2019-02-07 12:03:41.796608"], ["user_id", 2]]
  User Update All (0.2ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (11.3ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.812850"], ["updated_at", "2019-02-07 12:03:41.812850"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (12.1ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.831223"], ["updated_at", "2019-02-07 12:03:41.831223"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (11.3ms)  commit transaction
   (0.1ms)  begin transaction
  Star Create (1.2ms)  INSERT INTO "stars" ("created_at", "updated_at", "user_id") VALUES (?, ?, ?)  [["created_at", "2019-02-07 12:03:41.847880"], ["updated_at", "2019-02-07 12:03:41.847880"], ["user_id", 2]]
  User Update All (0.1ms)  UPDATE "users" SET "stars_count" = COALESCE("stars_count", 0) + 1 WHERE "users"."id" = ?  [["id", 2]]
   (13.2ms)  commit transaction
=> 100

user.stars_count
=> 100
이렇게 잘했어.

좋은 웹페이지 즐겨찾기