3

これが私がやろうとしていることです: 誰かが提供された特定のコースについてつぶやいたかどうかを調べます. 誰かが実際にそれについてツイートした場合、そのツイートをツイート モデルに保存し、そのツイートを対応するコース ページに表示したいと思います。

スクリプトは実行することでローカルで機能しますrails runner get_tweets.rbが、Heroku ではスクリプトは実行されるようですが、データベースには書き込まれません。Heroku ではheroku run rails runner get_tweets.rb(Cedar スタックを使用して) 実行しています。

def get_course_tweets
  @courses = Course.all
  @courses.each do |course|
    url = course.url
    tweets = Twitter.search(url, {:rpp => 100, :recent => true, :show_user => true})
    tweets.each do |tweet_info|
      unless Tweet.find_by_tweet_id(tweet_info.id).present?
        tweet = Tweet.new
        tweet.course_id = course.id
        tweet.tweet_id = tweet_info.id
        tweet.tweet_text = tweet_info.text
        tweet.from_user = tweet_info.from_user
        begin
          tweet.save!
        rescue => error
          puts error
        end
      end
    end
  end
end

編集:

レスキューから取得した現在のエラーは次のとおりです。

PG::Error: ERROR:  value "186306985577299969" is out of range for type integer : INSERT INTO "tweets" ("book_id", "course_id", "created_at", "from_user", "tutorial_id",     "tweet_already_exists", "tweet_id", "tweet_posted_to_reviews", "tweet_text", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"
4

2 に答える 2

0

Twitter API は、実際にはツイートやユーザーなどの 2 種類の ID を返します。1 つは数値で、もう 1 つは数値の文字列表現です。これは、さまざまな実装で ID がオーバーフローするほど多くのツイートとユーザーが存在する可能性が非常に高いためです。挿入時に文字列を値として使用すると、それはもう起こらないはずです。

フィールドは id_str と呼ばれます

于 2013-12-09T18:36:21.393 に答える