Po pierwsze nie mam pojęcia po co używać DBI razem z ActiveRecordem. DBI to interfejs do obsługi bazy danych, którego można używać oddzielnie, a ActiveRecord to ORM, który DBI w żaden sposób nie używa. Jeżeli nie jesteś zmuszony do użycia activerecordu (pogadaj z wykładowcą, może się zgodzi na coś innego), to do takich małych skryptów standalone ja bym użył DataMappera. W Datamapperze definicje pól trzymasz w modelu i masz metodę auto_migrate, dzięki czemu nie musisz się martwić o migracje.
A wracając do Twojego skryptu. Jeżeli używasz activerecorda i sqlite3, to nie musisz się martwić o stworzenie bazy, będzie to zrobione automatycznie. To czym musisz się martwić to stworzenie struktury. Można by oczywiście napisać kilka “create table” w czystym SQLu, ale nie po to się używa ORMa, żeby się w to bawić
[code]require ‘rubygems’
require ‘active_record’
tutaj tworzymy połączenie z bazą, która będzie zapisana w pliku db.sqlite
ActiveRecord::Base.establish_connection(
:adapter => “sqlite3”,
:database => “db.sqlite”
)
uruchamiamy migracje z katalogu migrations
ActiveRecord::Migrator.migrate File.expand_path("…/migrations", FILE)
class Notepad < ActiveRecord::Base
has_many :entries
end
class Entry < ActiveRecord::Base
belongs_to :notepad
end
notepad1 = Notepad.create[/code]
Przy takim kodzie wystarczy teraz, że wrzucisz migracje do katalogu migrations i wszystko powinno śmigać, np:
# ./migrations/1_create_notepads.rb
class CreateNotepads < ActiveRecord::Migration
def self.up
create_table :notepads do |t|
t.string :title
t.text :description
end
end
end
Jeżeli będziesz potrzebował jakichś prostych tasków do zarządzania migracjami, to przestudiuj metody w ActiveRecord::Migrator: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/migration.rb#L516
np. można by zrobić coś takiego:
[code]# Rakefile
require ‘active_record’
task :“db:migrate” do
ActiveRecord::Migrator.migrate File.expand_path("…/migrations", FILE)
end
task :“db:migrate:down” do
ActiveRecord::Migrator.down File.expand_path("…/migrations", FILE)
end[/code]