1

私はGalleryPostモデルを持っており、has_and_belongs_to_many両者の間には関係があります。モデルには、特定のギャラリーにある投稿の数を追跡するためposts_countの列があります。Gallery正常に動作しますが、必要以上に多くの DB ヒットを行います。

次のようなことgallery.posts.clearをすると、削除されるすべての投稿に対して DB 操作が行われます。

(0.3ms)  BEGIN
(0.9ms)  DELETE FROM "galleries_posts" WHERE "galleries_posts"."gallery_id" = 6 AND "galleries_posts"."post_id" IN (8, 6, 5, ..., 39, 40, 42, 41, 41, 44, 45, 47, 50, 49, 51)
(0.7ms)  UPDATE "galleries" SET "posts_count" = 54, "updated_at" = '2013-10-22 22:56:32.048238' WHERE "galleries"."id" = 6
(0.4ms)  UPDATE "galleries" SET "posts_count" = 53, "updated_at" = '2013-10-22 22:56:32.050582' WHERE "galleries"."id" = 6
(0.3ms)  UPDATE "galleries" SET "posts_count" = 52, "updated_at" = '2013-10-22 22:56:32.052247' WHERE "galleries"."id" = 6
...
(0.3ms)  UPDATE "galleries" SET "posts_count" = 3, "updated_at" = '2013-10-22 22:56:32.055607' WHERE "galleries"."id" = 6
(0.3ms)  UPDATE "galleries" SET "posts_count" = 2, "updated_at" = '2013-10-22 22:56:32.084547' WHERE "galleries"."id" = 6
(0.3ms)  UPDATE "galleries" SET "posts_count" = 1, "updated_at" = '2013-10-22 22:56:32.085752' WHERE "galleries"."id" = 6
(0.3ms)  UPDATE "galleries" SET "posts_count" = 0, "updated_at" = '2013-10-22 22:56:32.086861' WHERE "galleries"."id" = 6
(3.6ms)  COMMIT

これはn、カウントを更新するための DB 操作に相当します。ここnで、追加または削除された投稿の数です。

posts_countすべての投稿が追加または削除されたら、ギャラリーを 1 回だけ更新する操作に代わりに依存するカウントを維持する方法はありますか?

私の現在のメソッドはafter_add/で実行されafter_removeます:

class Gallery < ActiveRecord::Base
  ...
  has_and_belongs_to_many :posts, after_add: :increment_posts_count, 
                                  after_remove: :decrement_posts_count
  ...
  private
    def increment_posts_count(post)
      self.increment!(:posts_count)
    end

    def decrement_posts_count(post)
      self.decrement!(:posts_count)
    end
end

操作全体が完了した後にのみ実行するフックはありますか?

4

0 に答える 0