Techioz Blog

条件付きの Rails カウンタ キャッシュ

概要

中に部屋がある Rails Hotel アプリケーションがあります。ルームには n 個のチケットを関連付けることができます。カウンターカルチャージェムを使用してカウンターキャッシュを作成し、割り当てられたチケットの数でルームテーブルを更新しました。 問題は、オープンまたは進行中のチケットの数だけが必要であることです。このコードがありますが、通常は正常に機能しますが、条件付きでは機能しません。条件付きでどのように機能させるかを教えてくれる人はいますか?助けていただければ幸いです

ルームテーブル移行ファイル

 class AddTicketsCountToRooms < ActiveRecord::Migration[5.0]
    def self.up
      add_column :rooms, :tickets_count, :integer, null: false, default: 0
    end
  end

Ticket.rb ファイル

    belongs_to :room
  counter_culture :room, column_name: proc {|model| model.status? [0,1] 'tickets_count' : nil }

これは where 句に従っていません。 というエラーが表示されます

syntax error, unexpected tSTRING_BEG, expecting '}' {|model| model.status? [0,1] 'tickets_count' : nil } ^ /Users/mohammedsayerwala/Documents/Aqua/app/models/ticket.rb:8: syntax error, unexpected ':', expecting keyword_end tatus? [0,1] 'tickets_count' : nil }

解決策

Rails は counter_cache による条件を提供しません。 where 句と each も機能しません。

条件付きカウンターを実現するには、コード内でカスタム コールバックを使用し、条件付きのカスタム counter_cache でカウンター ブログを管理します。

あるいは、counter_culture gem、conditional-counter-cache を使用することもできます。

同様の質問の回答を参照してください - 条件付きカラムのカウンターキャッシュ?