Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重构模型:来自JSON的Tweet_Ruby On Rails_Ruby_Twitter_Refactoring - Fatal编程技术网

Ruby on rails 重构模型:来自JSON的Tweet

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)

我的应用程序正在使用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)
      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