I’m just doing ruby and rake, and am consciously staying away from RoR
for the time being – I may build a GUI with Fox down the road.
Possibly I have completely the wrong approach, but I want the “drop”
task
to invoke/call the migration file, with something along the lines of:
system “rake db:migrate RAILS_ENV=production”
the migration file:
module Agg
class Items < ActiveRecord::Migration
def self.up
create_table :items do |t|
t.column :title, :string
t.column :content, :string
t.column :source, :string
t.column :url, :string
t.column :timestamp, :timestamp
t.column :keyword_id, :integer
t.column :guid, :string
t.column :html, :string
end
end
def self.down
drop_table :items
end
end
the rake file:
require ‘rubygems’
require ‘active_record’
require ‘feed_tools’
require ‘yaml’
desc “connects to db”
task :connect do
db = YAML.load_file(“database.yml”)
ActiveRecord::Base.establish_connection(
:adapter => db[“adapter”],
:host => db[“host”],
:username => db[“username”],
:password => db[“password”],
:database => db[“database”])
class Item < ActiveRecord::Base
end
puts “connected to db”
end
desc “drop table items”
task :drop => :connect do
db = YAML.load_file(“database.yml”)
ActiveRecord::Base.establish_connection(
:adapter => db[“adapter”],
:host => db[“host”],
:username => db[“username”],
:password => db[“password”],
:database => db[“database”])
class Item < ActiveRecord::Base
end
#drop table if exists Item.table #fails
puts “dropped items”
#system “rake db:migrate RAILS_ENV=production”
#apparently this may invoke a migration?
end
desc “creates table items unless exists”
task :create => :connect do
db = YAML.load_file("database.yml")
ActiveRecord::Base.establish_connection(
:adapter => db["adapter"],
:host => db["host"],
:username => db["username"],
:password => db["password"],
:database => db["database"])
class Item < ActiveRecord::Base
end
unless Item.table_exists?
ActiveRecord::Schema.define do
create_table :items do |t|
t.column :title, :string
t.column :content, :string
t.column :source, :string
t.column :url, :string
t.column :timestamp, :timestamp
t.column :keyword_id, :integer
t.column :guid, :string
t.column :html, :string
end
end
end
end
desc “clobber the db”
task :clobber => [:connect, :drop, :create, :populate, :iterate] do
puts “clobber”
end
desc “gets rss data”
task :populate => :connect do
#feed = FeedTools::Feed.open(‘http://www.slashdot.org/index.rss’)
feed = FeedTools::Feed.open(‘www.amazon.com/rss/tag/blu-ray/new’)
feed.items.each do |feed_item|
unless (Item.find_by_title(feed_item.title)\
or Item.find_by_url(feed_item.link)\
or Item.find_by_guid(feed_item.guid))
puts "processing item '#{feed_item.title}' - new"
Item.new do |newitem|
newitem.title=feed_item.title.gsub(/<[^>]*>/, '')
newitem.guid=feed_item.guid
if feed_item.publisher.name
newitem.source=feed_item.publisher.name
end
newitem.url=feed_item.link
newitem.content=feed_item.description
newitem.timestamp=feed_item.published
newitem.save
end
else
puts "processing item '#{feed_item.title}' - old"
end
end
end
desc “query”
task :iterate => [:connect] do
end
How can I make the rakefile more concise by drawing more upon the
migration and model?
thanks,
Thufir