在ruby / rails中过滤哈希中的哈希数组

时间:2009-12-09 20:42:59

标签: ruby-on-rails ruby arrays hash filter

我正在使用FeedTools聚合RSS源。 我遵循了本教程:http://simonwoodside.com/weblog/2008/12/7/ruby_on_rails_feedrss_aggregator/,一切运行正常。

问题是我想从解析后的feed散列中过滤数组[:items]中存在的一些散列。

以下是我的数据库中的RSS缓存Feed对象:

  create_table "cached_feeds", :force => true do |t|
    t.string   "uri"
    t.text     "parsed_feed"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

在脚本/控制台中,解析后的Feed看起来像这样:

parsed_feed: {:uri => "http://www.someblog.com",
:items =>
[ {:published_at => some date,
  :link => "http://www.someblog.com/somelink.html",
  :title => "Some Title"},

  {:published_at => another date,
  :link => "http://www.someblog.com/anotherlink.html",
  :title => "Another Title"} ]
}

正如您所看到的,parsed_feed有两个哈希:uri和:items。 :items将所有Feed项详细信息隐藏在大量哈希值中。

现在让我们说“Some Title”已经是数据库中文章的名称。 RSS提要项目列表的目的是告诉用户其RSS源中的哪些文章尚未上传到数据库中,因此我只想在视图中显示“另一个标题”。

控制器中的此方法可以很好地显示没有过滤器的所有项目:

def read_cache
    website_articles = @website.article_names.to_a #This would return ["Some Title"]
    @@uris = ["#{Website.find(params[:id]).feed}"]
    @@uris.map { |uri|
    feed = CachedFeed.find_by_uri( uri ).parsed_feed
    feed[:items].map { |item| {:feed_title => @@title_map[feed[:title]] || feed[:title],   :feed_item => item} }
    } .flatten.sort_by { |item| item[:feed_item][:published] } .reverse
  end

我尝试在.flatten之后插入此代码作为过滤器

.reject {|k,v| website_articles.include? v}

如果我正在过滤普通哈希,但是从哈希中的哈希数组中过滤,这将有效。我错过了什么?如何在没有出现“Some Title”的情况下让“Another Title”出现在视图中?

2 个答案:

答案 0 :(得分:2)

由于拒绝中的v{ :feed_title => "Some Title", ... }之类的哈希值,因此应该有效:

.reject {|k, v| website_articles.include? v[:feed_title] }

答案 1 :(得分:1)

@Jordan

当我这样做时,我没有回来。但是,你的答案确实让我走上正轨。

做了一点修补,显然我不需要两个变量用于哈希:

.reject {|item| website_articles.include? item[:feed_item][:title]}

感谢您让我走上正轨!