我正在尝试与Twitter API交互,以在我的网站上显示user_timeline。
我按照railscasts.com视频进行了Twitter整合:http://railscasts.com/episodes/359-twitter-integration
我正在与API进行交互,将信息提取到我的应用程序中,它正在显示并正在开发中。
我的代码如下:
模型 - timeline.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上也遇到了另一个错误。
感谢。
答案 0 :(得分:2)
您已将tweet_id
创建为字符串(PostgreSQL中的AKA varchar(255)
):
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
的整数而不是当前字符串,则可以选择以下几种方法:
一旦你明白了,你应该在本地安装PostgreSQL,并在你计划部署到Heroku时在PostgreSQL之上进行开发。