aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/info_request.rb
diff options
context:
space:
mode:
authorMark Longair <mhl@pobox.com>2013-08-19 10:34:05 +0100
committerMark Longair <mhl@pobox.com>2013-08-20 12:11:45 +0100
commite5855f7fd2657574c5af99890c63d530ca3bb5d0 (patch)
tree338b64fd532af727027ada82b7a4d2042855e305 /app/models/info_request.rb
parent32625f08b9c7e7bb65bd24099e64d7d17be5e45e (diff)
Improve calculation of PublicBody statistics columns
On PublicBody, we don't need to update info_requests_count because that's already done with :counter_cache. On the other hand, info_requests_successful_count and info_requests_not_held_count can't be updated easily with counter_cache (since they need conditions to be attached). Instead we update them in post_save and post_destroy, as suggested here: http://blog.douglasfshearer.com/post/17495285851/custom-counter-cache-with-conditions This also adds tests to ensure that the after_(save|destroy) callbacks are called and that they modify the counts correctly.
Diffstat (limited to 'app/models/info_request.rb')
-rw-r--r--app/models/info_request.rb11
1 files changed, 11 insertions, 0 deletions
diff --git a/app/models/info_request.rb b/app/models/info_request.rb
index 9bce2ca88..91bd37d9f 100644
--- a/app/models/info_request.rb
+++ b/app/models/info_request.rb
@@ -1125,6 +1125,17 @@ public
end
end
+ after_save :update_counter_cache
+ after_destroy :update_counter_cache
+ def update_counter_cache
+ self.public_body.info_requests_not_held_count = InfoRequest.where(
+ :public_body_id => self.public_body.id,
+ :described_state => 'not_held').count
+ self.public_body.info_requests_successful_count = InfoRequest.where(
+ :public_body_id => self.public_body.id,
+ :described_state => ['successful', 'partially_successful']).count
+ end
+
def for_admin_column
self.class.content_columns.map{|c| c unless %w(title url_title).include?(c.name) }.compact.each do |column|
yield(column.human_name, self.send(column.name), column.type.to_s, column.name)