如何在Heroku上运行“Rails Runner”?

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"

也许你应该在发生 rescue 的时候将错误打印出来,看看是否有任何错误发生? - Andrew Marshall
嗨,安德鲁,这是我得到的错误信息:PG :: Error:ERROR:值“186306985577299969”超出了整数类型的范围: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” - Carl Sednaoui
2个回答

3

从您的错误信息中可以看出

值"186306985577299969"超出了整数类型的范围

您需要使用不同的数据类型(对于tweet_id,我认为),可能是一个BIGINT,其范围为-9223372036854775808至9223372036854775807。

在Rails中,您可以在up迁移中传递:limit => 8来实现:

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

请注意,当您进行rescue操作时,应始终进行某种形式的日志记录或报告,否则像这样的错误将变得非常难以追踪,因为它们会被静默地绕过。


嗨,安德鲁,非常感谢!这是我最终做出的:`t.column :tweet_id, :bigint`出于好奇,在这种情况下,:limit => 8会有什么作用? - Carl Sednaoui
它指示使用8字节整数,即BIGINT。我没有预料到在迁移中:bigint可以作为类型工作,因为我找不到任何文档记录它。 - Andrew Marshall

0
Twitter API实际上会返回推文和用户等的两种类型的ID,一种是数字,而另一种是数字的字符串表示形式。这是因为它非常有可能在不同的实现中溢出ID,如果您在插入时使用字符串作为值,则不应再发生这种情况。
该字段称为id_str。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接