Rails:检索LONGBLOB对象作为其原始类型

时间:2012-08-13 23:10:30

标签: mysql ruby-on-rails ruby-on-rails-3

我将一个Feed类型的对象存储到我的mysql数据库中作为longblob,并想知道如何检索它而不是String类型。

有没有办法在我忽略的ruby / rails中进行类型转换?

我假设发生了什么事,因为我得到了“未定义的方法`条目”#

一些背景,以防我做了一些愚蠢的事......

我的迁移:

class AddFeedDataToFeeds < ActiveRecord::Migration
  def change
    add_column :feeds, :feed_data, :longblob
  end
end

class FillFeedData < ActiveRecord::Migration
  def up

    Feed.all.each do |f|
      f.update_attribute(:feed_data, Feedzirra::Feed.fetch_and_parse(f.feed_url))
    end

  end

在我的读者控制器中:

next_feed = Feed.find(session[:unread_random].pop)
    @feed = next_feed

在读者中:

<% unless @feed.is_a? Fixnum #protect against bad feed URLs: 404, 503 etc...
    @feed.entries.each do |entry| %>
    <div class="entry">
        <h1><%= entry.title %></h1>

...等 错误抛出最后一个代码段的第二行。

1 个答案:

答案 0 :(得分:0)

以下是解决方案:

我意识到当Rails将Feedzirra AtomFeedBurner或RSSFeedBurner(或任何Feedzirra的解析器)存储到longblob列中时,它将其存储为文本而不是二进制文件。

我尝试了几件事,Base64的encode64只接受字符串,因此不起作用。

事实证明,您需要使用Marshal.dump和Marshal.load将对象序列化和反序列化为blob字段,以保护原始对象的完整性。

这对我来说现在很好。最后,我确信我需要一个更优化的解决方案。

还发现,对于类型转换,你可以使用.becomes()但这不是一个好主意。