上下文:预算跟踪应用,其中包含大量直接属于用户的收据。
我必须保留的许多计算之一是从第1天开始输入的所有收据的总计。随着时间的推移和收据的增加,这将需要更长的时间来计算并可能成为瓶颈。这将被频繁调用 - 每次用户添加新收据,编辑旧收据等。
所以我想知道如何避免这种不断的总结。也许我应该以某种方式将围栏收据分成月份文件夹,每个文件夹保留其小计的跟踪。因此,如果在任何月份添加新收据,则仅计算这些收据的金额。这是正确的方法,应该如何实施?我应该在这里创建一个月模型吗?
我不是一个很棒的数据库设计,并希望有人能够评论这种方法或提供更清洁的方式。
答案 0 :(得分:1)
查看活动记录中的counter_cache。这听起来像是一个典型的例子。
在用户模型上,您将添加“receiptts_count”列。
add_column :users, :receipts_count, :integer, :default => 0, :null => false
在收据模型上,您将添加
belongs_to :user, :counter_cache => true
您还想了解如何最初设置该数字。您可以使用rake任务或在迁移中执行此操作。正如你所看到的,这有一些陷阱。计数器缓存是只读的并且在迁移时更新它们,您需要设置值和ActiveRecord :: Base.connection.execute(“...”)命令
网上有很多关于此问题的讨论,有轨电视等等,如果你愿意的话,可以添加一个自定义计数器,你会想要阅读更多内容,而不是在这里添加。