From 6dc32aa83b2208e582b9175ae9bb688af9187dab Mon Sep 17 00:00:00 2001 From: bsag Date: Tue, 2 May 2006 21:47:30 +0000 Subject: [PATCH] Updated the migration files so that any updates to rows are done via ruby rather than raw SQL. With any luck at all, this might fix the various problems people encounter when trying to use rake migrate on different databases. At any rate, it should be a lot more portable between databases. Also added some ruby code to the fixture files so that boolean columns will be set correctly depending on database adapter, and also the created_at and other date or datetime fields are set dynamically. Finally, I also changed the names of the old migration files to match the new naming convention (001_filename.rb, 002_filename.rb etc.) With the new rake syntax, you can run: rake db:migrate to create the tables (for MySQL create the db first, but with sqlite/sqlite3 you just have to list the name in database.yml, but you don't need to create the db itself). Then, rake db:fixtures:load if you want some example contents. I'm HOPING that this fixes #261, #268 and even #205 which I closed because I gave up. I've tested rake db:migrate and rake db:fixtures:load by creating new mysql and sqlite3 databases, and that works fine on my system. git-svn-id: http://www.rousette.org.uk/svn/tracks-repos/trunk@233 a4c988fc-2ded-0310-b66e-134b36920a42 --- ...e_tracks_db.rb => 001_create_tracks_db.rb} | 0 tracks/db/migrate/002_add_user_id.rb | 16 +++ .../{3_created_at.rb => 003_created_at.rb} | 4 +- .../db/migrate/{4_notes.rb => 004_notes.rb} | 0 ...tion.rb => 005_add_project_description.rb} | 0 .../006_add_preferences_to_user_table.rb | 4 +- tracks/db/migrate/2_add_user_id.rb | 16 --- tracks/db/schema.rb | 38 +++--- tracks/db/{tracks-104.db => tracks-1041.db} | Bin 11264 -> 11264 bytes tracks/test/fixtures/contexts.yml | 34 ++++-- tracks/test/fixtures/deferreds.yml | 5 - tracks/test/fixtures/immediates.yml | 5 - tracks/test/fixtures/notes.yml | 20 +++- tracks/test/fixtures/projects.yml | 23 +++- tracks/test/fixtures/todos.yml | 108 ++++++++++++------ 15 files changed, 169 insertions(+), 104 deletions(-) rename tracks/db/migrate/{1_create_tracks_db.rb => 001_create_tracks_db.rb} (100%) create mode 100644 tracks/db/migrate/002_add_user_id.rb rename tracks/db/migrate/{3_created_at.rb => 003_created_at.rb} (72%) rename tracks/db/migrate/{4_notes.rb => 004_notes.rb} (100%) rename tracks/db/migrate/{5_add_project_description.rb => 005_add_project_description.rb} (100%) delete mode 100644 tracks/db/migrate/2_add_user_id.rb rename tracks/db/{tracks-104.db => tracks-1041.db} (82%) delete mode 100644 tracks/test/fixtures/deferreds.yml delete mode 100644 tracks/test/fixtures/immediates.yml diff --git a/tracks/db/migrate/1_create_tracks_db.rb b/tracks/db/migrate/001_create_tracks_db.rb similarity index 100% rename from tracks/db/migrate/1_create_tracks_db.rb rename to tracks/db/migrate/001_create_tracks_db.rb diff --git a/tracks/db/migrate/002_add_user_id.rb b/tracks/db/migrate/002_add_user_id.rb new file mode 100644 index 00000000..0cbe9226 --- /dev/null +++ b/tracks/db/migrate/002_add_user_id.rb @@ -0,0 +1,16 @@ +class AddUserId < ActiveRecord::Migration + def self.up + add_column :contexts, :user_id, :integer, :default => 1 + add_column :projects, :user_id, :integer, :default => 1 + add_column :todos, :user_id, :integer, :default => 1 + Context.find(:all).each { |context| context.user_id = 1 } + Project.find(:all).each { |project| project.user_id = 1 } + Todo.find(:all).each { |todo| todo.user_id = 1 } + end + + def self.down + remove_column :contexts, :user_id + remove_column :projects, :user_id + remove_column :todos, :user_id + end +end diff --git a/tracks/db/migrate/3_created_at.rb b/tracks/db/migrate/003_created_at.rb similarity index 72% rename from tracks/db/migrate/3_created_at.rb rename to tracks/db/migrate/003_created_at.rb index 47fa00f7..fd9d6041 100644 --- a/tracks/db/migrate/3_created_at.rb +++ b/tracks/db/migrate/003_created_at.rb @@ -3,10 +3,10 @@ class CreatedAt < ActiveRecord::Migration # if the column names use symbols instead of strings. # def self.up - rename_column "todos", "created", "created_at" + rename_column :todos, :created, :created_at end def self.down - rename_column "todos", "created_at", "created" + rename_column :todos, :created_at, :created end end diff --git a/tracks/db/migrate/4_notes.rb b/tracks/db/migrate/004_notes.rb similarity index 100% rename from tracks/db/migrate/4_notes.rb rename to tracks/db/migrate/004_notes.rb diff --git a/tracks/db/migrate/5_add_project_description.rb b/tracks/db/migrate/005_add_project_description.rb similarity index 100% rename from tracks/db/migrate/5_add_project_description.rb rename to tracks/db/migrate/005_add_project_description.rb diff --git a/tracks/db/migrate/006_add_preferences_to_user_table.rb b/tracks/db/migrate/006_add_preferences_to_user_table.rb index 38f2781e..e8f507de 100644 --- a/tracks/db/migrate/006_add_preferences_to_user_table.rb +++ b/tracks/db/migrate/006_add_preferences_to_user_table.rb @@ -1,6 +1,6 @@ class AddPreferencesToUserTable < ActiveRecord::Migration def self.up - add_column "users", "preferences", :text + add_column :users, :preferences, :text @users = User.find(:all) @users.each do |u| u.preferences = { "date_format" => "%d/%m/%Y", "week_starts" => "1", "no_completed" => "5", "staleness_starts" => "7", "due_style" => "1", "admin_email" => "butshesagirl@rousette.org.uk"} @@ -9,6 +9,6 @@ class AddPreferencesToUserTable < ActiveRecord::Migration end def self.down - remove_column "users", "preferences" + remove_column :users, :preferences end end diff --git a/tracks/db/migrate/2_add_user_id.rb b/tracks/db/migrate/2_add_user_id.rb deleted file mode 100644 index 8453d47c..00000000 --- a/tracks/db/migrate/2_add_user_id.rb +++ /dev/null @@ -1,16 +0,0 @@ -class AddUserId < ActiveRecord::Migration - def self.up - add_column "contexts", "user_id", :integer, :default => 1 - add_column "projects", "user_id", :integer, :default => 1 - add_column "todos", "user_id", :integer, :default => 1 - execute "UPDATE 'contexts' SET 'user_id' = 1;" - execute "UPDATE 'projects' SET 'user_id' = 1;" - execute "UPDATE 'todos' SET 'user_id' = 1;" - end - - def self.down - remove_column :contexts, :user_id - remove_column :projects, :user_id - remove_column :todos, :user_id - end -end diff --git a/tracks/db/schema.rb b/tracks/db/schema.rb index f3aa4036..82f00e2e 100644 --- a/tracks/db/schema.rb +++ b/tracks/db/schema.rb @@ -5,26 +5,26 @@ ActiveRecord::Schema.define(:version => 8) do create_table "contexts", :force => true do |t| - t.column "name", :string, :default => "", :null => false - t.column "hide", :integer, :limit => 4, :default => 0, :null => false - t.column "position", :integer, :default => 0, :null => false + t.column "name", :string, :null => false + t.column "position", :integer, :null => false + t.column "hide", :boolean, :default => false t.column "user_id", :integer, :default => 1 end create_table "notes", :force => true do |t| - t.column "user_id", :integer, :default => 0, :null => false - t.column "project_id", :integer, :default => 0, :null => false + t.column "user_id", :integer, :null => false + t.column "project_id", :integer, :null => false t.column "body", :text - t.column "created_at", :datetime - t.column "updated_at", :datetime + t.column "created_at", :datetime, :default => Sat Jan 01 00:00:00 GMT 2000 + t.column "updated_at", :datetime, :default => Sat Jan 01 00:00:00 GMT 2000 end create_table "projects", :force => true do |t| - t.column "name", :string, :default => "", :null => false - t.column "position", :integer, :default => 0, :null => false - t.column "done", :integer, :limit => 4, :default => 0, :null => false + t.column "name", :string, :null => false + t.column "position", :integer, :null => false + t.column "done", :boolean, :default => false t.column "user_id", :integer, :default => 1 - t.column "description", :text + t.column "description", :text, :default => "" end create_table "sessions", :force => true do |t| @@ -36,24 +36,24 @@ ActiveRecord::Schema.define(:version => 8) do add_index "sessions", ["session_id"], :name => "sessions_session_id_index" create_table "todos", :force => true do |t| - t.column "context_id", :integer, :default => 0, :null => false - t.column "description", :string, :limit => 100, :default => "", :null => false + t.column "context_id", :integer, :null => false + t.column "project_id", :integer + t.column "description", :string, :null => false t.column "notes", :text - t.column "done", :integer, :limit => 4, :default => 0, :null => false - t.column "created_at", :datetime + t.column "done", :boolean, :default => false, :null => false + t.column "created_at", :datetime, :default => Sat Jan 01 00:00:00 GMT 2000 t.column "due", :date t.column "completed", :datetime - t.column "project_id", :integer t.column "user_id", :integer, :default => 1 t.column "type", :string, :default => "Immediate", :null => false t.column "show_from", :date end create_table "users", :force => true do |t| - t.column "login", :string, :limit => 80 - t.column "password", :string, :limit => 40 + t.column "login", :string, :limit => 80, :null => false + t.column "password", :string, :limit => 40, :null => false t.column "word", :string - t.column "is_admin", :integer, :limit => 4, :default => 0, :null => false + t.column "is_admin", :boolean, :default => false, :null => false t.column "preferences", :text end diff --git a/tracks/db/tracks-104.db b/tracks/db/tracks-1041.db similarity index 82% rename from tracks/db/tracks-104.db rename to tracks/db/tracks-1041.db index 89e5219bfc0685bfd1ccaae0b60fb8885fc92b7a..559f6244916508cb8c39021de7f731d5662cf7e8 100644 GIT binary patch delta 240 zcmZpOXo#2~Ehx!=3M3}#I5To=Ea+!uUiOTp~sW1_nTVK%`(`Ux9Xq$HM1)>nKo Td6vTT$yy5ei#RwIX|MnQ`|Us1 delta 153 zcmZpOXo#2~Ehxr-3PdLAI5To?Ea+!u8Pv>2F#m_-;38D=tQO>~r)JW)P> q@=v)LlO^OHO%|4tVC0yrBejIZK-a)v@)apV2!m7l_huHAKkNVp`z2HW diff --git a/tracks/test/fixtures/contexts.yml b/tracks/test/fixtures/contexts.yml index bba6c650..d0f5c0a0 100644 --- a/tracks/test/fixtures/contexts.yml +++ b/tracks/test/fixtures/contexts.yml @@ -1,64 +1,80 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +<% + # This writes the fixture boolean columns appropriately + # depending on the database adapter + # + abcs = ActiveRecord::Base.configurations + case abcs[RAILS_ENV]["adapter"] + when "mysql", "oci" + b_true = 1 + b_false = 0 + when "postgresql", "sqlite", "sqlite3" + b_true = 't' + b_false = 'f' + else + raise "Task not supported by '#{abcs["test"]["adapter"]}'" + end +%> agenda: id: 1 name: agenda position: 1 - hide: 0 + hide: <%= b_false %> user_id: 1 call: id: 2 name: call position: 2 - hide: 0 + hide: <%= b_false %> user_id: 1 email: id: 3 name: email position: 3 - hide: 0 + hide: <%= b_false %> user_id: 1 errand: id: 4 name: errand position: 4 - hide: 0 + hide: <%= b_false %> user_id: 1 lab: id: 5 name: lab position: 5 - hide: 0 + hide: <%= b_false %> user_id: 1 library: id: 6 name: library position: 6 - hide: 0 + hide: <%= b_false %> user_id: 1 freetime: id: 7 name: freetime position: 7 - hide: 0 + hide: <%= b_false %> user_id: 1 office: id: 8 name: office position: 8 - hide: 0 + hide: <%= b_false %> user_id: 1 waitingfor: id: 9 name: waiting for position: 9 - hide: 0 + hide: <%= b_false %> user_id: 1 diff --git a/tracks/test/fixtures/deferreds.yml b/tracks/test/fixtures/deferreds.yml deleted file mode 100644 index 8794d28a..00000000 --- a/tracks/test/fixtures/deferreds.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/tracks/test/fixtures/immediates.yml b/tracks/test/fixtures/immediates.yml deleted file mode 100644 index 8794d28a..00000000 --- a/tracks/test/fixtures/immediates.yml +++ /dev/null @@ -1,5 +0,0 @@ -# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html -first: - id: 1 -another: - id: 2 diff --git a/tracks/test/fixtures/notes.yml b/tracks/test/fixtures/notes.yml index 85e63b25..84052a6b 100644 --- a/tracks/test/fixtures/notes.yml +++ b/tracks/test/fixtures/notes.yml @@ -1,15 +1,27 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +<% +def today +Time.now.to_s(:db) +end +def next_week +1.week.from_now.to_s(:db) +end +def last_week +1.week.ago.to_s(:db) +end +%> + first_notes: id: 1 user_id: 1 project_id: 1 body: Need to collect a catalogue from Time Machines R Us - created_at: 2006-04-09 12:09:00 - updated_at: 2006-04-09 12:09:00 + created_at: <%= today %> + updated_at: <%= today %> another_notes: id: 2 user_id: 1 project_id: 1 body: Should I go for a swirly effect or a whooshy one? - created_at: 2006-04-08 11:01:05 - updated_at: 2006-04-08 11:01:05 + created_at: <%= today %> + updated_at: <%= today %> diff --git a/tracks/test/fixtures/projects.yml b/tracks/test/fixtures/projects.yml index 95c45f4d..df2ed2b5 100644 --- a/tracks/test/fixtures/projects.yml +++ b/tracks/test/fixtures/projects.yml @@ -1,11 +1,26 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html - +<% + # This writes the fixture boolean columns appropriately + # depending on the database adapter + # + abcs = ActiveRecord::Base.configurations + case abcs[RAILS_ENV]["adapter"] + when "mysql", "oci" + b_true = 1 + b_false = 0 + when "postgresql", "sqlite", "sqlite3" + b_true = 't' + b_false = 'f' + else + raise "Task not supported by '#{abcs["test"]["adapter"]}'" + end +%> timemachine: id: 1 name: Build a working time machine description: '' position: 1 - done: 0 + done: <%= b_false %> user_id: 1 moremoney: @@ -13,7 +28,7 @@ moremoney: name: Make more money than Billy Gates description: '' position: 2 - done: 0 + done: <%= b_false %> user_id: 1 gardenclean: @@ -21,5 +36,5 @@ gardenclean: name: Evict dinosaurs from the garden description: '' position: 3 - done: 0 + done: <%= b_false %> user_id: 1 diff --git a/tracks/test/fixtures/todos.yml b/tracks/test/fixtures/todos.yml index 9d24564b..04ac4eef 100644 --- a/tracks/test/fixtures/todos.yml +++ b/tracks/test/fixtures/todos.yml @@ -1,4 +1,36 @@ # Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +<% +def today + Time.now.to_s(:db) +end + +def next_week + 1.week.from_now.to_s(:db) +end + +def last_week + 1.week.ago.to_s(:db) +end + +def two_weeks_hence + 2.week.from_now.to_s(:db) +end + +# This writes the fixture boolean columns appropriately +# depending on the database adapter +# +abcs = ActiveRecord::Base.configurations +case abcs[RAILS_ENV]["adapter"] + when "mysql", "oci" + b_true = 1 + b_false = 0 + when "postgresql", "sqlite", "sqlite3" + b_true = 't' + b_false = 'f' + else + raise "Task not supported by '#{abcs["test"]["adapter"]}'" +end +%> 1: id: 1 @@ -6,9 +38,9 @@ project_id: 2 description: Call Bill Gates to find out how much he makes per day notes: ~ - done: 0 - created_at: 2004-11-28 16:01:00 - due: 2004-10-30 + done: <%= b_false %> + created_at: <%= last_week %> + due: <%= two_weeks_hence %> completed: ~ user_id: 1 @@ -18,9 +50,9 @@ project_id: 3 description: Call dinosaur exterminator notes: Ask him if I need to hire a skip for the corpses. - done: 0 - created_at: 2004-11-28 16:06:08 - due: 2004-11-30 + done: <%= b_false %> + created_at: <%= today %> + due: <%= two_weeks_hence %> completed: ~ user_id: 1 @@ -31,9 +63,9 @@ description: Buy milk notes: ~ done: 1 - created_at: 2004-11-28 16:06:31 + created_at: <%= today %> due: ~ - completed: 2004-11-28 + completed: <%= today %> user_id: 1 4: @@ -43,9 +75,9 @@ description: Buy bread notes: ~ done: 1 - created_at: 2004-11-28 16:06:58 + created_at: <%= today %> due: ~ - completed: 2004-11-28 + completed: <%= today %> user_id: 1 5: @@ -54,8 +86,8 @@ project_id: 1 description: Construct time dilation device notes: ~ - done: 0 - created_at: 2004-11-28 16:07:33 + done: <%= b_false %> + created_at: <%= today %> due: ~ completed: ~ user_id: 1 @@ -66,9 +98,9 @@ project_id: 1 description: Phone Grandfather to ask about the paradox notes: Added some _notes_. - done: 0 - created_at: 2004-11-28 16:08:33 - due: 2004-12-30 + done: <%= b_false %> + created_at: <%= today %> + due: <%= last_week %> completed: ~ user_id: 1 @@ -78,8 +110,8 @@ project_id: 3 description: Get a book out of the library notes: 'Dinosaurs''R' - done: 0 - created_at: 2004-12-22 14:07:06 + done: <%= b_false %> + created_at: <%= today %> due: ~ completed: ~ user_id: 1 @@ -90,10 +122,10 @@ project_id: ~ description: Upgrade to Rails 0.9.1 notes: ~ - done: 1 - created_at: 2004-12-20 17:02:52 - due: 2004-12-21 - completed: 2004-12-20 + done: <%= b_false %> + created_at: <%= today %> + due: <%= today %> + completed: ~ user_id: 1 9: @@ -102,9 +134,9 @@ project_id: ~ description: This should be due today notes: ~ - done: 0 - created_at: 2004-12-31 17:23:06 - due: 2004-12-31 + done: <%= b_false %> + created_at: <%= today %> + due: <%= today %> completed: ~ user_id: 1 @@ -115,9 +147,9 @@ description: foo notes: ~ done: 1 - created_at: 2004-12-31 18:38:34 + created_at: <%= today %> due: 2005-01-05 - completed: 2005-01-02 12:27:10 + completed: <%= today %> user_id: 1 11: @@ -126,8 +158,8 @@ project_id: 2 description: Buy shares notes: ~ - done: 0 - created_at: 2005-01-01 12:40:26 + done: <%= b_false %> + created_at: <%= today %> due: 2005-02-01 completed: ~ user_id: 1 @@ -138,10 +170,10 @@ project_id: 3 description: Buy stegosaurus bait notes: ~ - done: 1 - created_at: 2005-01-01 12:53:12 - due: 2005-01-02 - completed: 2005-01-01 15:44:19 + done: <%= b_false %> + created_at: <%= today %> + due: <%= next_week %> + completed: ~ user_id: 1 13: @@ -150,10 +182,10 @@ project_id: 3 description: New action in context notes: Some notes - done: 1 - created_at: 2005-01-02 14:52:49 - due: 2005-03-01 - completed: 2005-01-02 15:44:19 + done: <%= b_false %> + created_at: <%= today %> + due: <%= next_week %> + completed: ~ user_id: 1 14: @@ -162,8 +194,8 @@ project_id: 2 description: Call stock broker notes: 'tel: 12345' - done: 0 - created_at: 2005-01-03 11:38:25 + done: <%= b_false %> + created_at: <%= last_week %> due: ~ completed: ~ user_id: 1