Ruby on rails 重构模型:来自JSON的Tweet
我的应用程序正在使用sidekiq作业在数据库中保存一条Tweet。我正在分析rails模型中的JSON并创建依赖项 这个代码没问题Ruby on rails 重构模型:来自JSON的Tweet,ruby-on-rails,ruby,twitter,refactoring,Ruby On Rails,Ruby,Twitter,Refactoring,我的应用程序正在使用sidekiq作业在数据库中保存一条Tweet。我正在分析rails模型中的JSON并创建依赖项 这个代码没问题 class PersistToDbWorker include Sidekiq::Worker def perform(tweet_id, user_id) tweet = TempTweet.get(tweet_id) if tweet db_tweet = Tweet.where(:id => tweet_id)
class PersistToDbWorker
include Sidekiq::Worker
def perform(tweet_id, user_id)
tweet = TempTweet.get(tweet_id)
if tweet
db_tweet = Tweet.where(:id => tweet_id)
if db_tweet.empty?
tweet_user = TweetUser.create_or_update_tweet_user(tweet['user'])
t = Tweet.create_from_json(tweet)
t.tweet_user tweet_user
t.users << User.find(user_id)
t.save!
else
db_tweet.first.tweet_users << User.find(user_id)
end
end
end
end
类PersistToDbWorker
包括Sidekiq::Worker
def执行(推特id、用户id)
tweet=testweet.get(tweet\u id)
如果推特
db_tweet=tweet.where(:id=>tweet_id)
如果db_tweet.empty?
tweet\u user=TweetUser。创建或更新tweet\u用户(tweet['user'])
t=Tweet.create_from_json(Tweet)
t、 推特用户推特用户
t、 用户url['expanded_url'],
:url=>url['url'],
:display\u url=>url['display\u url'])
结束
结束
def self.from_tweet_user_提及tweet_user
tweet\u users=TweetUser.where(:id=>tweet\u user['id'])
如果tweet_用户存在?
首先返回tweet_用户
其他的
返回TweetUser.new(:id=>tweet\u user['id'],
:screen\u name=>tweet\u用户['screen\u name'],
:name=>tweet_用户['name'])
结束
结束
结束
类Tweeth[k.to\u s])
a、 现在??a.first:klass.new(Hash[[k,*ks].map{| k |[k,h[k.to_s]})
}
结束
结束
这个问题属于它,这已经是一个很好的改变了,谢谢你的帮助!除了打字错误之外,还有两件事不起作用,那就是from_tweet不能被调用,因为ruby不承认它是一个类方法。如果它被调用,那么这个方法的属性是空的,那么你知道如何帮助吗?我从编辑中了解你的意思。我很抱歉大多数编辑完成后,会有一些变化,但问题是方法create_from_json返回一个空对象,你知道它应该返回什么吗?即使是类方法,create_from_json仍然返回nil,你知道为什么吗?
class Tweet < ActiveRecord::Base
belongs_to :tweet_user
has_and_belongs_to_many :tweet_users
has_and_belongs_to_many :tweet_hashtags
has_and_belongs_to_many :tweet_urls
has_and_belongs_to_many :users
def self.create_from_json json
new_tweet = Tweet.new
new_tweet.id = json['id']
new_tweet.text = json['text']
if json['place']
place = json['place']
new_tweet.country = place['country']
new_tweet.country_code = place['country_code']
new_tweet.place_name = place['name']
new_tweet.place_type = place['type']
new_tweet.place_full_name = place['full_name']
end
new_tweet.tweet_user_id = json['user']['id']
new_tweet.source = json['source']
new_tweet.retweet_count = json['retweet_count']
new_tweet.in_reply_to_user_id = json['in_reply_to_user_id']
new_tweet.in_reply_to_status_id = json['in_reply_to_status_id']
new_tweet.in_reply_to_screen_name = json['in_reply_to_screen_name']
json['entities']['hashtags'].each do |hashtag|
new_tweet.tweet_hashtags << from_tweet_hashtag(hashtag)
end
json['entities']['urls'].each do |url|
new_tweet.tweet_urls << from_tweet_url(url)
end
json['entities']['user_mentions'].each do |user|
new_tweet.tweet_users << from_tweet_user_mention(user)
end
new_tweet.created_at = Time.parse(json['created_at'])
new_tweet
end
private
def self.from_tweet_hashtag hashtag
hashtags = TweetHashtag.where(:text => hashtag['text'])
if hashtags.present?
return hashtags.first
else
return TweetHashtag.new(:text => hashtag['text'])
end
end
def self.from_tweet_url url
urls = TweetUrl.where(:url => url['url'])
if urls.present?
return urls.first
else
return TweetUrl.new(:id => url['id'],
:expanded_url => url['expanded_url'],
:url => url['url'],
:display_url => url['display_url'])
end
end
def self.from_tweet_user_mention tweet_user
tweet_users = TweetUser.where(:id => tweet_user['id'])
if tweet_users.present?
return tweet_users.first
else
return TweetUser.new(:id => tweet_user['id'],
:screen_name => tweet_user['screen_name'],
:name => tweet_user['name'])
end
end
end
class Tweet < ActiveRecord::Base
belongs_to :tweet_user
has_and_belongs_to_many :tweet_users
has_and_belongs_to_many :tweet_hashtags
has_and_belongs_to_many :tweet_urls
has_and_belongs_to_many :users
def self.create_from_json json; new.instance_eval do
%w[
id text source retweet_count in_reply_to_user_id in_reply_to_status_id
in_reply_to_screen_name
].each{|k| instance_variable_set("@#{k}", json[k])}
@tweet_user_id = json["user"]["id"]
@created_at = Time.parse(json["created_at"])
from_tweet(@tweet_hashtags, "hashtags",
TweetHashtag, e, :text)
from_tweet(@tweet_urls, "urls",
TweetUrl, e, :url, :id, :expanded_url, :display_url)
from_tweet(@tweet_users, "user_mentions",
TweetUser, e, :id, :screen_name, :name)
if place = json["place"]
@country = place["country"]
@country_code = place["country_code"]
@place_name = place["name"]
@place_type = place["type"]
@place_full_name = place["full_name"]
end
end end
private
def from_tweet property, s, klass, h, k, *ks
property.concat(json["entities"][s].map{|e|
a = klass.where(k => h[k.to_s])
a.present? ? a.first : klass.new(Hash[[k, *ks].map{|k| [k, h[k.to_s]]}])
}
end
end