Skip to content

Commit

Permalink
added counter cache for photos on StatusMessage
Browse files Browse the repository at this point in the history
  • Loading branch information
danielgrippi committed Dec 17, 2011
1 parent 0929f15 commit 97b8045
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 3 deletions.
5 changes: 5 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ GEM
uuidtools
childprocess (0.2.3)
ffi (~> 1.0.6)
chronic (0.6.6)
client_side_validations (3.1.3)
cloudfiles (1.4.10)
mime-types (>= 1.16)
Expand Down Expand Up @@ -424,6 +425,9 @@ GEM
webmock (1.6.2)
addressable (>= 2.2.2)
crack (>= 0.1.7)
whenever (0.7.0)
activesupport (>= 2.3.4)
chronic (~> 0.6.3)
will_paginate (3.0.2)
xpath (0.1.4)
nokogiri (~> 1.3)
Expand Down Expand Up @@ -515,5 +519,6 @@ DEPENDENCIES
typhoeus
vanna!
webmock
whenever
will_paginate (= 3.0.2)
yard
7 changes: 6 additions & 1 deletion app/models/photo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,20 @@ class Photo < ActiveRecord::Base
xml_attr :text
xml_attr :status_message_guid

belongs_to :status_message, :foreign_key => :status_message_guid, :primary_key => :guid
belongs_to :status_message, :foreign_key => :status_message_guid, :primary_key => :guid, :counter_cache => :photos_count

attr_accessible :text, :pending
validate :ownership_of_status_message

before_destroy :ensure_user_picture
after_destroy :clear_empty_status_message

after_create :queue_processing_job

after_save do
self.status_message.update_photos_counter if status_message
end

def clear_empty_status_message
if self.status_message_guid && self.status_message.text_and_photos_blank?
self.status_message.destroy
Expand Down
7 changes: 6 additions & 1 deletion app/models/status_message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -178,13 +178,18 @@ def text_and_photos_blank?
def queue_gather_oembed_data
Resque.enqueue(Jobs::GatherOEmbedData, self.id, self.oembed_url)
end

def contains_oembed_url_in_text?
require 'uri'
urls = URI.extract(self.raw_message, ['http', 'https'])
self.oembed_url = urls.find{|url| ENDPOINT_HOSTS_STRING.match(URI.parse(url).host)}
end

def update_photos_counter
StatusMessage.where(:id => self.id).
update_all(:photos_count => self.photos.count)
end

protected
def presence_of_content
if text_and_photos_blank?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
class CounterCacheOnPostComments < ActiveRecord::Migration
class Post < ActiveRecord::Base; end

def self.up
add_column :posts, :comments_count, :integer, :default => 0
execute <<SQL if Post.count > 0
Expand Down
15 changes: 15 additions & 0 deletions db/migrate/20111217042006_add_photo_counter_cache_to_post.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class AddPhotoCounterCacheToPost < ActiveRecord::Migration
class Post < ActiveRecord::Base; end

def self.up
add_column :posts, :photos_count, :integer, :default => 0
execute <<SQL if Post.count > 0
UPDATE posts
SET photos_count = (SELECT COUNT(*) FROM photos WHERE photos.status_message_guid = posts.guid)
SQL
end

def self.down
remove_column :posts, :photos_count
end
end
3 changes: 2 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.

ActiveRecord::Schema.define(:version => 20111207233503) do
ActiveRecord::Schema.define(:version => 20111217042006) do

create_table "account_deletions", :force => true do |t|
t.string "diaspora_handle"
Expand Down Expand Up @@ -314,6 +314,7 @@
t.integer "likes_count", :default => 0
t.integer "comments_count", :default => 0
t.integer "o_embed_cache_id"
t.integer "photos_count", :default => 0
end

add_index "posts", ["author_id", "root_guid"], :name => "index_posts_on_author_id_and_root_guid", :unique => true
Expand Down

0 comments on commit 97b8045

Please sign in to comment.