class Feed < ActiveRecord::Base has_many :posts, :dependent => :destroy has_many :subscriptions has_many :layers, :through => :subscriptions, :uniq => true attr_accessible :title, :url, :description, :generator, :last_fetched, :feed_url attr_accessor :new_layer_id # non model attribute used when creating new feeds from within a layer validates_format_of :feed_url, :with => URI::regexp(%w(http https)), :message => "must be a valid URL" after_create :fetch def self.fetch_all Feed.all.each { |f| f.delay.fetch } end # Fetch and parse feed contents from web def fetch puts "Fetching feed: #{self.feed_url}" Feedzirra::Feed.add_common_feed_entry_element('georss:point', :as => :point) Feedzirra::Feed.add_common_feed_entry_element('geo:lat', :as => :geo_lat) Feedzirra::Feed.add_common_feed_entry_element('geo:long', :as => :geo_long) Feedzirra::Feed.add_common_feed_element('generator', :as => :generator) feed = Feedzirra::Feed.fetch_and_parse(self.feed_url) self.update_attributes( :title => feed.title, :url => feed.url, :description => feed.description, :generator => feed.generator, :last_fetched => DateTime.now ) feed.entries.each do |e| if e.geo_lat && e.geo_long latlon = [e.geo_lat, e.geo_long] elsif e.point latlon = e.point.split(' ') else next end attrs = { :title => e.title, :url => e.url, :author => e.author, :summary => e.summary, :content => e.content, :published => e.published, :guid => e.id, :lon => latlon[1].to_f, :lat => latlon[0].to_f } # Create a new post or update an existing one post = Post.find_or_initialize_by_url(e.url) post.feed = self post.assign_attributes(attrs) post.save end end end