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

3

从您的错误中可以看出

值“186306985577299969”超出整数类型的范围

您需要使用不同的数据类型(对于tweet_id,我相信),大概是 a BIGINT,其范围从 -9223372036854775808 到 9223372036854775807。

要在 Rails 中执行此操作,您可以传入:limit => 8迁移up

change_column :tweets, :tweet_id, :integer, :limit => 8

请注意,您应该始终进行某种记录或报告rescue,否则像这样的错误会变得非常难以追踪,因为它们会悄悄地被绕过。

于 2012-04-07T18:17:36.753 回答
0

Twitter API 实际上为推文和用户等发送回两种类型的 ID,一种是数字,另一种是数字的字符串表示形式。这是因为他们很有可能拥有如此多的推文和用户,以至于 ID 可能在不同的实现中溢出。如果您在插入时使用 String 作为您的值,则不应再发生。

该字段称为 id_str

于 2013-12-09T18:36:21.393 回答