From 67882c775e7dcb701f5910fd8581c1de0f3fafa3 Mon Sep 17 00:00:00 2001 From: danielgrippi Date: Sat, 9 Jul 2011 16:19:34 -0700 Subject: [PATCH] Addded Diaspora::Likeable module. Corrected the unique index for likes to include author_id; extracted before_save callback needed for tags into Diaspora::Taggable. --- app/models/comment.rb | 9 +-------- app/models/like.rb | 1 - app/models/post.rb | 10 ++-------- app/models/status_message.rb | 1 - .../20110707234802_likes_on_comments.rb | 2 +- db/schema.rb | 1 + lib/diaspora/likeable.rb | 20 +++++++++++++++++++ lib/diaspora/taggable.rb | 2 ++ 8 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 lib/diaspora/likeable.rb diff --git a/app/models/comment.rb b/app/models/comment.rb index 4014e9990..65d4a3d6f 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -14,6 +14,7 @@ class Comment < ActiveRecord::Base include Diaspora::Socketable include Diaspora::Taggable + include Diaspora::Likeable acts_as_taggable_on :tags extract_tags_from :text @@ -25,8 +26,6 @@ class Comment < ActiveRecord::Base belongs_to :post, :touch => true belongs_to :author, :class_name => 'Person' - has_many :likes, :conditions => {:positive => true}, :dependent => :delete_all, :as => :target - validates_presence_of :text, :post validates_length_of :text, :maximum => 2500 @@ -62,10 +61,4 @@ class Comment < ActiveRecord::Base def parent= parent self.post = parent end - - # @return [Integer] - def update_likes_counter - self.likes_count = self.likes.count - self.save - end end diff --git a/app/models/like.rb b/app/models/like.rb index a645aca71..16e3475f6 100644 --- a/app/models/like.rb +++ b/app/models/like.rb @@ -11,7 +11,6 @@ class Like < ActiveRecord::Base xml_attr :target_type include Diaspora::Relayable - include Diaspora::Socketable xml_attr :positive diff --git a/app/models/post.rb b/app/models/post.rb index f3c9ab9cc..45dec7028 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -9,13 +9,13 @@ class Post < ActiveRecord::Base include Diaspora::Webhooks include Diaspora::Guid + include Diaspora::Likeable + xml_attr :diaspora_handle xml_attr :public xml_attr :created_at has_many :comments, :dependent => :destroy - has_many :likes, :conditions => {:positive => true}, :dependent => :delete_all, :as => :target - has_many :dislikes, :conditions => {:positive => false}, :class_name => 'Like', :dependent => :delete_all, :as => :target has_many :aspect_visibilities has_many :aspects, :through => :aspect_visibilities @@ -52,12 +52,6 @@ class Post < ActiveRecord::Base new_post end - # @return [Integer] - def update_likes_counter - self.likes_count = self.likes.count - self.save - end - # @return Returns true if this Post will accept updates (i.e. updates to the caption of a photo). def mutable? false diff --git a/app/models/status_message.rb b/app/models/status_message.rb index 145b724ae..3701d3066 100644 --- a/app/models/status_message.rb +++ b/app/models/status_message.rb @@ -24,7 +24,6 @@ class StatusMessage < Post serialize :youtube_titles, Hash - before_create :build_tags after_create :create_mentions def text(opts = {}) diff --git a/db/migrate/20110707234802_likes_on_comments.rb b/db/migrate/20110707234802_likes_on_comments.rb index 3438c4a9b..693b3dfdd 100644 --- a/db/migrate/20110707234802_likes_on_comments.rb +++ b/db/migrate/20110707234802_likes_on_comments.rb @@ -12,7 +12,7 @@ class LikesOnComments < ActiveRecord::Migration SET target_type = 'Post' SQL - add_index :likes, [:target_id, :target_type], :unique => true + add_index :likes, [:target_id, :author_id, :target_type], :unique => true end def self.down diff --git a/db/schema.rb b/db/schema.rb index 6ca59081c..4c3cbf3b4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -123,6 +123,7 @@ ActiveRecord::Schema.define(:version => 20110707234802) do add_index "likes", ["author_id"], :name => "likes_author_id_fk" add_index "likes", ["guid"], :name => "index_likes_on_guid", :unique => true + add_index "likes", ["target_id", "author_id", "target_type"], :name => "index_likes_on_target_id_and_author_id_and_target_type", :unique => true add_index "likes", ["target_id"], :name => "index_likes_on_post_id" create_table "mentions", :force => true do |t| diff --git a/lib/diaspora/likeable.rb b/lib/diaspora/likeable.rb new file mode 100644 index 000000000..6d0fc532d --- /dev/null +++ b/lib/diaspora/likeable.rb @@ -0,0 +1,20 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3 or later. See +# the COPYRIGHT file. + +module Diaspora + module Likeable + def self.included(model) + model.instance_eval do + has_many :likes, :conditions => {:positive => true}, :dependent => :delete_all, :as => :target + has_many :dislikes, :conditions => {:positive => false}, :class_name => 'Like', :dependent => :delete_all, :as => :target + end + end + + # @return [Integer] + def update_likes_counter + self.likes_count = self.likes.count + self.save + end + end +end diff --git a/lib/diaspora/taggable.rb b/lib/diaspora/taggable.rb index 8302cbe81..0c706a8eb 100644 --- a/lib/diaspora/taggable.rb +++ b/lib/diaspora/taggable.rb @@ -11,6 +11,8 @@ module Diaspora cattr_accessor :field_with_tags end model.instance_eval do + before_create :build_tags + def extract_tags_from sym self.field_with_tags = sym end