When processing entries in a just fetched feed, we build new entries
with ```feed.entries.build``` before knowing if we actually are going to
save the entry in the database. It's possible that the entry won't
actually be saved (e.g. we have fetched an entry with the same guid as
another entry for the same feed already in the db).
In this case we MUST ensure that this new entry, which won't be saved in
the db, doesn't stay in the feed.entries association. Otherwise any
attempt to save the feed afterwards (e.g. feed.save or feed.update) will
fail because it also attempts to save the associated entries and the
feed.entries association in this case contains an invalid entry.
The fix is:
- if the entry is actually saved in the db, invoke feed.save!. This also
saves the entry we created with feed.entries.build.
- if the entry is not saved because one of the validations in
EntryManager fails, reload the feed (feed.reload) so that the entries
association is reloaded from the db, discarding the invalid entry
- if any exception is raised during processing entries, reload the feed
(feed.reload) just in case, to make doubly sure that when
EntryManager.save_new_entries returns the feed object and its
feed.entries association is in a valid state and can be saved in the db.
↧