diff options
author | Rhenium <rhenium@rhe.jp> | 2014-02-28 06:29:16 +0900 |
---|---|---|
committer | Rhenium <rhenium@rhe.jp> | 2014-02-28 06:29:16 +0900 |
commit | b2c328e84d03e73d94938f2f2bf58585feaf9625 (patch) | |
tree | e697a1b1cd65f0f224c8e9dce0b06138b898f4ef /app/models/favorite.rb | |
parent | 8e70230529b7c9a3979bca3479e5043a0773912e (diff) | |
download | aclog-b2c328e84d03e73d94938f2f2bf58585feaf9625.tar.gz |
refactor collector-receiver
Diffstat (limited to 'app/models/favorite.rb')
-rw-r--r-- | app/models/favorite.rb | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/app/models/favorite.rb b/app/models/favorite.rb index bc66127..d266135 100644 --- a/app/models/favorite.rb +++ b/app/models/favorite.rb @@ -2,25 +2,32 @@ class Favorite < ActiveRecord::Base belongs_to :tweet belongs_to :user - after_create do - Tweet.update_counters(self.tweet_id, favorites_count: 1, reactions_count: 1) - end - - after_destroy do - Tweet.update_counters(self.tweet_id, favorites_count: -1, reactions_count: -1) - end + def self.create_from_json(json) + tweet = Tweet.create_from_json(json[:target_object]) + user = User.create_from_json(json[:source]) - def self.from_json(json) - tweet = Tweet.from_json(json[:target_object]) - user = User.from_json(json[:source]) favorite = Favorite.new(tweet: tweet, user: user) - favorite.save! - logger.debug("Successfully created a favorite: #{favorite.id}") + + transaction do + favorite.save! + tweet.update_reactions_count(favorites_count: 1, json: json[:target_object]) + end rescue ActiveRecord::RecordNotUnique => e - logger.debug("Failed to create a favorite: #{favorite}: #{e.class}") + logger.debug("Duplicate favorite: #{favorite.user_id} => #{favorite.tweet_id}") rescue => e - logger.error("Failed to create a favorite: #{favorite}: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}") + logger.error("Failed to create a favorite: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}") ensure return favorite end + + def self.destroy_from_json(json) + transaction do + deleted_count = self.where(user_id: json[:source][:id], tweet_id: json[:target_object][:id]).delete_all + if deleted_count > 0 + Tweet.find(json[:target_object][:id]).update_reactions_count(favorites_count: -1, json: json[:target_object]) + end + end + rescue => e + logger.error("Failed to destroy a favorite: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}") + end end |