diff options
author | Rhenium <rhenium@rhe.jp> | 2014-01-20 07:30:54 +0900 |
---|---|---|
committer | Rhenium <rhenium@rhe.jp> | 2014-01-20 07:30:54 +0900 |
commit | 2ad52ebb033394cb721f55a90af977adfb596a16 (patch) | |
tree | 20f686a5364f4e3ab676a2e59340d6962e90f839 /app/models/tweet.rb | |
parent | 2c1096b493bfe45d87bd8c4233215ecc04af947a (diff) | |
download | aclog-2ad52ebb033394cb721f55a90af977adfb596a16.tar.gz |
update Tweet model
Diffstat (limited to 'app/models/tweet.rb')
-rw-r--r-- | app/models/tweet.rb | 91 |
1 files changed, 25 insertions, 66 deletions
diff --git a/app/models/tweet.rb b/app/models/tweet.rb index fbaf02b..3e5017b 100644 --- a/app/models/tweet.rb +++ b/app/models/tweet.rb @@ -42,62 +42,27 @@ class Tweet < ActiveRecord::Base end end - def self.delete_from_id(id) - return {} if id.is_a?(Array) && id.size == 0 - begin - # counter_cache の無駄を省くために delete_all で - deleted_tweets = Tweet.where(id: id).delete_all - if deleted_tweets > 0 - deleted_favorites = Favorite.where(tweet_id: id).delete_all - deleted_retweets = Retweet.where(tweet_id: id).delete_all - end - - unless id.is_a?(Integer) && deleted_tweets == 1 - deleted_retweets = Retweet.where(id: id).destroy_all.size # counter_cache - end - - return {tweets: deleted_tweets, favorites: deleted_favorites, retweets: deleted_retweets} - rescue - logger.error("Unknown error while deleting tweet: #{$!}/#{$@}") - end - end - - def self.delete_from_receiver(msg) - delete_from_id(msg["id"]) - end - - def self.from_receiver(msg) - transaction do - t = self.find_by(id: msg["id"]) - unless t - begin - u = User.from_receiver(msg["user"]) - t = self.create!(id: msg["id"], - text: extract_entities(msg["text"], msg["entities"]), - source: msg["source"], - tweeted_at: Time.parse(msg["created_at"]), - in_reply_to_id: msg["in_reply_to_status_id"], - user: u) - logger.debug("Created Tweet: #{msg["id"]}") - rescue ActiveRecord::RecordNotUnique - logger.debug("Duplicate Tweet: #{msg["id"]}") - end - end - return t + def self.from_json(msg) + find_by(id: msg[:id]) || begin + user = User.from_json(msg[:user]) + create!(id: msg[:id], + text: extract_entities(msg), + source: msg[:source], + tweeted_at: msg[:created_at], + in_reply_to_id: msg[:in_reply_to_status_id], + user: user) end + rescue ActiveRecord::RecordNotUnique + logger.debug("Duplicate Tweet: #{msg[:id]}") rescue => e logger.error("Unknown error while inserting tweet: #{e.class}: #{e.message}/#{e.backtrace.join("\n")}") - return nil end def self.from_twitter_object(obj) - self.from_receiver("id" => obj.id, - "text" => obj.text, - "source" => obj.source, - "created_at" => obj.created_at, - "in_reply_to_id" => obj.in_reply_to_status_id, - "user_id" => obj.user_id, - "entities" => obj.attrs[:entities]) + tweet = from_json(obj.attrs) + tweet.update!(favorites_count: obj.favorites_count, + retweets_count: obj.retweets_count, + reactions_count: obj.favorites_count + obj.retweets_count) end def self.filter_by_query(query) @@ -141,27 +106,21 @@ class Tweet < ActiveRecord::Base end private - def self.extract_entities(text, entities) - escape_colon = -> str { str.gsub(":", "\\:") } - entities = entities.map { |k, v| v.map { |n| n.update("type" => k) } }.flatten.sort_by { |entity| entity["indices"].first } + def self.extract_entities(json) + entity_values = json[:entities].values.sort_by {|v| v[:indices].first } result = "" - last_index = entities.inject(0) do |last_index_, entity| - result << text[last_index_...entity["indices"].first] - case entity["type"] - when "urls", "media" - result << "<url:#{escape_colon.call(entity["expanded_url"])}:#{escape_colon.call(entity["display_url"])}>" - when "hashtags" - result << "<hashtag:#{entity["text"]}>" - when "user_mentions" - result << "<mention:#{entity["screen_name"]}>" - when "symbols" - result << "<symbol:#{entity["text"]}>" + last_index = entity_values.inject(0) do |last_index, entity| + result << json[:text][last_index...entity["indices"].first] + if entity.key?(:url) + result << entity[:expanded_url] + else + result << entity[:text] end - entity["indices"].last + entity[:indices].last end - result << text[last_index..-1] + result << json[:text][last_index..-1] result end |