diff --git a/Gemfile.lock b/Gemfile.lock index 030d725ae..7ed234cfe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) @@ -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) @@ -515,5 +519,6 @@ DEPENDENCIES typhoeus vanna! webmock + whenever will_paginate (= 3.0.2) yard diff --git a/app/models/photo.rb b/app/models/photo.rb index c45784c83..c9300f379 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -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 diff --git a/app/models/status_message.rb b/app/models/status_message.rb index bc99ae62c..ddd4746ea 100644 --- a/app/models/status_message.rb +++ b/app/models/status_message.rb @@ -178,13 +178,18 @@ class StatusMessage < Post 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? diff --git a/db/migrate/20110911213207_counter_cache_on_post_comments.rb.rb b/db/migrate/20110911213207_counter_cache_on_post_comments.rb similarity index 99% rename from db/migrate/20110911213207_counter_cache_on_post_comments.rb.rb rename to db/migrate/20110911213207_counter_cache_on_post_comments.rb index 65f6fef00..4eee63e35 100644 --- a/db/migrate/20110911213207_counter_cache_on_post_comments.rb.rb +++ b/db/migrate/20110911213207_counter_cache_on_post_comments.rb @@ -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 < 0 diff --git a/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb b/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb new file mode 100644 index 000000000..a614f26d8 --- /dev/null +++ b/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb @@ -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 < 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 diff --git a/db/schema.rb b/db/schema.rb index 7bef47de8..26a9bacf3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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" @@ -314,6 +314,7 @@ ActiveRecord::Schema.define(:version => 20111207233503) do 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