2009-12-09 7 views
0

J'agrège les flux RSS en utilisant FeedTools. J'ai suivi ce tutoriel: http://simonwoodside.com/weblog/2008/12/7/ruby_on_rails_feedrss_aggregator/ et tout a bien fonctionné. Le problème est que je veux filtrer certains des hachages qui existent dans le tableau [: items] de l'intérieur du hachage de feed analysé.Filtrer un tableau de hachage dans un hachage dans ruby ​​/ rails

est ici l'objet flux RSS mises en cache dans ma base de données:

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

dans le script/console l'alimentation analysable ressemble à quelque chose comme ceci:

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"} ] 
} 

Comme vous pouvez le voir, il y a deux hash pour parsed_feed ,: uri et: articles. : les éléments ont tous les détails de l'élément de flux cachés dans un grand nombre de hachages.

Dites maintenant que "Some Title" est déjà le nom d'un article dans la base de données. Le but de la liste de flux RSS est de dire à l'utilisateur quels articles de son flux RSS n'ont pas encore été téléchargés dans la base de données, donc je veux seulement que "Un autre titre" apparaisse dans la vue.

Cette méthode dans le contrôleur fait un bon travail montrant tous les éléments sans filtre:

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 

J'ai essayé d'insérer ce code après .flatten comme un filtre

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

Cela fonctionnerait si je filtrais un hachage normal, mais filtrer à partir d'un tableau de hachage dans un hachage. Qu'est-ce que je rate? Comment puis-je faire apparaître "Another Title" dans la vue sans que "Some Title" apparaisse?

Répondre

1

@Jordan

Je suis un nul quand je l'ai fait. Cependant, votre réponse m'a mis sur la bonne voie.

a fait un peu de bricolage et apparemment je n'ai pas besoin de deux variables pour le hachage:

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

Merci de me faire sur la bonne voie!

+0

Heureux que vous l'ayez compris! –

2

Depuis v dans votre rejet est un hachage comme { :feed_title => "Some Title", ... }, cela devrait fonctionner:

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