Rails - кэширование общей суммы поступлений в приложении для составления бюджета - лучшая практика - PullRequest
0 голосов
/ 08 декабря 2010

Контекст: приложение отслеживания бюджета, которое будет иметь много квитанций, принадлежащих непосредственно пользователю.

Один из многих расчетов, которые мне придется сохранить, - это промежуточные суммы всех поступлений, введенных с первого дня. С течением времени и увеличением поступлений это займет больше времени для расчета и, возможно, станет узким местом.И это будет вызываться часто - каждый раз, когда пользователь добавляет новую квитанцию, редактирует старую и т. Д.

Поэтому мне интересно, как мне избежать этого постоянного суммирования.Возможно, я должен каким-то образом разделить поступления чеков на ежемесячные папки, каждая папка следит за своим промежуточным итогом.Таким образом, если добавить новый чек в любой месяц, для этих чеков рассчитывается только сумма.Это правильный подход и как он должен быть реализован?Должен ли я создавать модель месяцев здесь?

Я не очень хорош в дизайне БД и надеялся, что кто-то сможет прокомментировать этот подход или предложить более чистый способ.

1 Ответ

1 голос
/ 08 декабря 2010

Посмотрите на counter_cache в активной записи.Это звучит как классический пример.

В модели User вы добавите столбец 'receivets_count'.

add_column :users, :receipts_count, :integer, :default => 0, :null => false

А в модели квитанций вы добавите

belongs_to :user, :counter_cache => true

Вы также захотите узнать, как изначально установить это число.Вы можете сделать это с помощью граблей или в процессе миграции.В этом есть некоторые ошибки, как вы увидите.Кэши счетчиков доступны только для чтения, и для их обновления в процессе миграции вам необходимо установить значение с помощью команды ActiveRecord :: Base.connection.execute ("...")

Существует много дискуссийОб этом в Интернете, Railscasts и т. д., и есть способ добавить пользовательский счетчик, если вы хотите, вы хотите прочитать больше о нем, чем я могу добавить здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...