你如何在heroku中运行“Rails Runner”?
这就是我想要做的事情:查看是否有人发布了关于特定课程的推文。 如果有人确实在Twitter上发了推文,我想把这条推文保存到我的推文模型中,然后在相应的课程页面中显示该推文。
脚本通过运行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"
从错误中可以看出
值“186306985577299969”超出了整数类型的范围
你需要使用不同的数据类型(对于tweet_id
,我相信),大概是BIGINT
,范围从-9223372036854775808到9223372036854775807。
要在Rails中执行此操作,您可以在up
迁移中传递:limit => 8
:
change_column :tweets, :tweet_id, :integer, :limit => 8
请注意,在rescue
时应始终进行某种日志记录或报告,否则这样的错误很难追踪,因为它们会被默默地绕过。
Twitter API实际上为推文和用户等发回两种类型的ID,一种是数字,另一种是数字的字符串表示。 这是因为它们很可能会有如此多的推文和用户,ID可以在不同的实现中溢出。 如果在插入时使用String作为值,则不应再发生。
该字段称为id_str