0

我正在尝试与 Twitter API 交互以在我的网站上显示 user_timeline。

我跟随 railscasts.com 视频进行 Twitter 集成:http ://railscasts.com/episodes/359-twitter-integration

我可以很好地与 API 交互,将信息拉入我的应用程序,它正在显示并在开发中工作。

我的代码如下:

模型 - 时间线.rb

class Timeline < ActiveRecord::Base
  attr_accessible :content, :screen_name, :tweet_id

  def self.pull_tweets
   Twitter.user_timeline("{username_goes_here}", since_id: maximum(:tweet_id)).each do |tweet|
    unless exists?(tweet_id: tweet.id)
      create!(
        tweet_id: tweet.id,
        content: tweet.text,
        screen_name: tweet.user.screen_name,
      )
    end
  end
end
end

这是迁移:

class CreateTimelines < ActiveRecord::Migration
  def change
    create_table :timelines do |t|
     t.string :tweet_id
     t.string :screen_name
     t.text :content

     t.timestamps
end

结束结束

并显示推文:

<div id="timeline">
      <% Timeline.order("tweet_id desc").limit(3).each do |timeline| %>
         <h3><%= timeline.content %></h3>

        <p class="pull-right">
            ~ @<%= timeline.screen_name %>
        </p>
      <% end %>
    </div>

这个想法是将推文存储在数据库中,这样即使 Twitter 关闭,也不会影响看到最新推文的用户。

无论如何,当我Timeline.pull_tweets在控制台中运行命令时,它工作正常。

当我推送到 heroku、迁移数据库并尝试运行相同的命令时。

然后我得到这个错误:

  PGError: ERROR:  operator does not exist: character varying = bigint
LINE 1: ...ne FROM "timelines"  WHERE "timelines"."tweet_id" = 21919081...
                                                         ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

有什么帮助吗?

我也尝试运行迁移,以便它:tweet_id是一个整数,但我在 heroku 上也遇到了另一个错误。

谢谢。

4

1 回答 1

2

您已创建tweet_id为字符串(varchar(255)PostgreSQL 中的又名):

create_table :timelines do |t|
  t.string :tweet_id

但是你的tweet.id

unless exists?(tweet_id: tweet.id)

实际上是一个数字。如果您想继续将您的存储tweet_id为字符串,那么您必须在id使用它的任何地方将其转换为字符串:

unless exists?(tweet_id: tweet.id.to_s)
  create!(
    tweet_id: tweet.id.to_s,
    ...

如果您想修复您的生产表以使用整数tweet_id而不是当前字符串,您有几个选择:

  1. 删除并使用正确的架构重新创建表。这可以正常工作,但您将丢失所有数据。
  2. 手动发出ALTER TABLE 以便您可以使用 USING告诉 PostgreSQL 如何将您的字符串转换为整数。

一旦你弄清楚了,如果你打算部署到 Heroku,你应该在本地安装 PostgreSQL 并在 PostgreSQL 之上开发。

于 2012-07-02T00:25:26.180 回答