【问题标题】:Why can I not save tweets into the database?为什么我不能将推文保存到数据库中?
【发布时间】:2012-07-05 02:35:21
【问题描述】:

我想将推文保存到数据库中,但它不起作用!我正在使用 twitter gem。

我的控制器:

class TweetsController < ApplicationController

def save_tweets_into_database
    @tweets = Twitter.search("#em2012" "#Italy" "#Spain", :lang => "en", :rpp => 25).results
    @tweets.each do |tweet|
        @tweet = tweet
        @tweet.create
    end
end
end

我的模特

require "rubygems"
require "twitter"


class Tweet < ActiveRecord::Base

end

我的看法

<% @title = "liste" %>
<h2>Liste der Tweets über das EM-Finale</h2>
<ul>
    <% @tweets.each do |tweet| %>
        <li><%= tweet %></li>
    <% end %>
</ul>

我的路线

Em2012tweet::Application.routes.draw do

  match '/save_tweets', to: 'tweets#save_tweets_into_database'
end

显示此错误:

Twitter::Status:0x007fac9c80a160 的未定义方法“create”

Rails.root:/Users/xyz/Desktop/Workspace/em2012tweet

app/controllers/tweets_controller.rb:7:in `block in save_tweets_into_database'

app/controllers/tweets_controller.rb:5:in `each'

app/controllers/tweets_controller.rb:5:in `save_tweets_into_database'

【问题讨论】:

  • Erm,可能是因为您没有将其保存到数据库中?我找不到.create.save 或类似的...
  • 你能帮帮我吗?如何存储输出?
  • 我建议您先阅读 Rails 指南或购买一本书,以了解 Rails 世界的运作方式:) guides.rubyonrails.org

标签: ruby twitter ruby-on-rails-3.1 rubygems


【解决方案1】:

tweets_controller.rb:

class TweetsController < ApplicationController

  def save_tweets_into_database
    @tweets = Twitter.search("#em2012" "#Italy" "#Spain", :lang => "en", :rpp => 25)
    @tweets.each do |tweet|
      Tweet.create(twitter_tweet: tweet)
    end
  end
end

tweet.rb:

class Tweet < ActiveRecord::Base
  serialize :twitter_tweet
end

请注意,这需要您进行迁移,其中使用名为“twitter_tweet”的文本列创建 tweets 表,例如

class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.text :twitter_tweets

      t.timestamps
    end
  end
end

这将允许您调用save_tweets_into_database 并将返回的 25 条推文保存到数据库中。这不是一个很好的策略,因为您正在序列化每个 Twitter::Status 对象并将它们作为 YAML 存储在您的数据库中。这意味着您失去了使用所有好的 ActiveRecord 助手的能力,而必须在实际使用它们之前反序列化您想要使用的所有对象。更好的策略是创建一个 ActiveRecord 对象,该对象具有与您希望保存的 Twitter::Status 对象相同的属性。然后,您可以将获取的 Twitter::Status 对象映射到新的 ActiveRecord Tweet 对象,并保留使用 ActiveRecord 的所有好处。

我不会对您的路由结构发表任何评论,除非它似乎绝对没有遵循“Rails”方式,根据经验,这通常会导致相当多的麻烦。

【讨论】:

  • 我如何访问数据以分析,谁是意大利的一切,谁是西班牙的?
  • 如果您只想简单地访问Twitter::Status 对象,只需像普通的ActiveRecord 属性-Tweet.first.twitter_tweet 一样访问它。这将返回Twitter::Status 对象,允许您将其视为从未序列化过的对象。如果您想搜索所有推文的文本,最好重新审视您存储推文的方式。如果需要,我可以进一步详细说明。
【解决方案2】:

将推文保存到数据库中

在 Rails 中,遵循 REST 约定,index 操作与简单地显示已存储在数据库中的模型的所有对象相关联。这实际上也是您对代码所做的。您的 index 操作没有执行任何将推文保存到数据库中的操作。

我不认为你想在这里保存推文。您试图简单地显示它们。如果您只想在索引视图文件中显示推文,请尝试此操作。

def index
  @tweets = Twitter.search("#em2012" "#italy" "#spain", :lang => "en", :rpp => 25).results
end

如果您想保存推文,请创建这样的操作。

def save_tweets_into_database
  @tweets = Twitter.search("#em2012" "#italy" "#spain", :lang => "en", :rpp => 25).results
  @tweets.each do |tweet|
    Tweet.save(tweet)
  end
end

【讨论】:

  • 我必须在哪个文件中存储此代码?在控制器或模型文件中?
  • 它应该在你的 tweets_controller 中。要执行此操作,您需要配置路由,以便有一个与此操作关联的路径,match '/save_tweets', to: 'tweets#save_tweets_into_database'。如果您在 url 中转到此路径,“localhost:3000/save_tweets”,rails 将执行 save_tweets_into_database 操作并通过执行 Twitter.search("#em2012" "#italy" "#spain", :lang =&gt; "en", :rpp =&gt; 25).results 保存您抓取的所有推文。
  • 我认为你必须处理的是重复。我的方法对是否保存重复的推文没有任何作用。我猜这是你必须要做的事情。
  • 如果我这样做,我会收到以下错误消息:未定义方法 `save' for #<:status:0x007fc003b2ec40>
  • 如果你这样做会发生什么。用这个替换tweet.save@tweet = tweet,然后是@tweet.save
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 2016-05-07
  • 2021-07-29
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
相关资源
最近更新 更多