2010-03-20 5 views
1

en essayant d'obtenir ma tête Feedzirra ici.Ruby - Feedzirra et mises à jour

Je l'ai tout l'installation et tout, et peut même obtenir des résultats et des mises à jour, mais quelque chose d'étrange se passe.

je suis venu avec le code suivant:

def initialize(feed_url) 
    @feed_url = feed_url 
    @rssObject = Feedzirra::Feed.fetch_and_parse(@feed_url) 
    end 

    def update_from_feed_continuously()  
    @rssObject = Feedzirra::Feed.update(@rssObject) 
    if @rssObject.updated? 
     puts @rssObject.new_entries.count 
    else 
     puts "nil" 
    end 
    end 

droit, ce que je fais ci-dessus, commence avec le grand flux, et seulement obtenir des mises à jour. Je suis sûr que je dois faire quelque chose de stupide, car même si je suis capable d'obtenir les mises à jour, et les stocker sur la même variable d'instance, après la première fois, je ne suis jamais capable de les obtenir à nouveau.

Évidemment, cela se produit parce que j'écrase ma variable d'instance avec seulement des mises à jour, et perd l'objet de flux complet.

Je me suis alors pensé à changer mon code à ceci:

def update_from_feed_continuously()  
    feed = Feedzirra::Feed.update(@rssObject) 
    if feed.updated? 
     puts feed.new_entries.count 
    else 
     puts "nil" 
    end 
    end 

Eh bien, je ne suis pas rien et que écraser devrait être le moyen d'aller à droite? Cela signifie que je suis condamné à toujours essayer d'obtenir des mises à jour du même objet de flux statique, car même si je reçois les mises à jour sur une variable, je ne mets jamais à jour mon "objet de flux statique", et les éléments nouvellement ajoutés seront ajoutés à mes "feed.new_entries" car ils sont en théorie nouveaux. Je suis sûr que je manque une étape ici, mais j'apprécierais vraiment que quelqu'un puisse me faire la lumière là-dessus. J'ai parcouru ce code pendant des heures et je n'arrive pas à le comprendre.

Il est évident que cela devrait fonctionner très bien, si je faisais quelque chose comme:

if feed.updated? 
    puts feed.new_entries.count 
    @rssObject = initialize(@feed_url) 
else 

Parce que cela ma variable réinitialise exemple avec un objet d'alimentation flambant neuf, et les mises à jour reviendraient.

Mais cela signifie également que toute nouvelle mise à jour ajoutée à ce moment précis serait perdue, ainsi que surpasser massivement, car je devrais charger la chose à nouveau.

Merci d'avance!

+0

Comment sont souvent vous réessayant votre flux? Si vous l'obtenez la première fois, puis regardez à nouveau plus tard, vous pourriez ne voir aucun changement si le flux n'a pas été mis à jour pendant ce temps, ce qui me fait penser que vous voyez le bon comportement. Une autre chose à considérer est le problème potentiel de garder l'information en mémoire et de réutiliser la variable. Si votre code meurt, vous perdez l'état et devrez recharger tous les flux que vous suivez dans leur intégralité. Cela pourrait être très coûteux si vous suivez des milliers de flux. Pour un seul flux, ce n'est pas une affaire mais pour un grand nombre, vous avez besoin d'une base de données pour suivre les états. –

Répondre

6

Comment faire des mises à jour est un peu contre-intuitif avec l'API actuelle.Cet exemple montre la meilleure façon de le faire:

# I'm using Atom here, but it could be anything. You don't need to know ahead of time. 
# It will parse out to the correct format when it updates. 
feed_to_update = Feedzirra::Parser::Atom.new 
feed_to_update.feed_url = some_stored_feed_url 
feed_to_update.etag = some_stored_feed_etag 
feed_to_update.last_modified = some_stored_feed_last_modified 

last_entry = Feedzirra::Parser::AtomEntry.new 
last_entry.url = the_url_of_the_last_entry_for_a_feed 

feed_to_update.entries = [last_entry] 

updated_feed = Feedzirra::Feed.update(feed_to_update) 

updated_feed.updated? # => nil if there is nothing new 
updated_feed.new_entries # => [] if nothing new otherwise a collection of feedzirra entries 
updated_feed.etag # => same as before if nothing new. although could change with comments added to entries. 
updated_feed.last_modified # => same as before if nothing new. although could change with comments added to entries. 

Fondamentalement, vous devrez Épargnes de quatre données (FEED_URL, last_modified, ETAG et l'url de l'entrée la plus récente). Ensuite, quand vous voulez faire des mises à jour, vous construisez un nouvel objet de fil et appelez la mise à jour sur cela.

+0

Pourriez-vous simplement enregistrer le fichier updated_feed dans votre base de données plutôt que de le reconstruire à chaque fois? – Nader

0

Vous pouvez réinitialiser @rssObject au flux mis à jour.

feed = Feedzirra::Feed.update(@rssObject) 
if feed.updated? 
    puts feed.new_entries.count 
    @rssObject = feed 
else 
    puts 'nil' 
end 

Le nombre d'entrées dans @rssObject ne cesse d'augmenter à mesure que de nouvelles entrées sont trouvées. Donc, si la première extraction trouve 10 entrées, puis trouve ensuite 10 nouvelles entrées, @rssObject.entries.size sera 20.

Notez que vous pouvez le faire indépendamment du fait que update trouve de nouvelles entrées. Si feed.updated? est faux, feed sera l'objet de flux d'origine, @rssObject.

Questions connexes