views:

1979

answers:

6

I am using Jruby and rails 2.2.2. My problem is I have a migration that is not being correctly written to the database schema.

Here is my migration:

class CreateNotes < ActiveRecord::Migration
  def self.up
    create_table(:notes, :options => 'ENGINE=MyISAM') do |t|
      t.string :title
      t.text :body

      t.timestamps
    end

    execute "alter table notes ADD FULLTEXT(title, body)"

end

Here is what it produces on in schema.rb

create_table "notes", :force => true do |t|
  t.string   "title"
  t.text     "body"
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "notes", ["title", "body"], :name => "title"

I have two question:

  • How do I get 'ENGINE=MyISAM' into the schema?
  • Why did my execute statement become add_index "notes", ["title", "body"], :name => "title"? and how do I force migrations to leave it as an execute statement?

Thanks to Christian Lescuyer for the answer. However, when I tried this nothing changed. I uncommented the config.active_record... line but, my schema has not changed. I have tried this in jruby and on ruby 1.8.6 with rails 2.2.2 and edge rails and there is not changes in the schema. Can anybody tell me what I am doing wrong?

+4  A: 

As I use foreign key constraints, I use the SQL format for migrations. In environment.rb:

# Use SQL instead of Active Record's schema dumper when creating the test database.
# This is necessary if your schema can't be completely dumped by the schema dumper,
# like if you have constraints or database-specific column types
config.active_record.schema_format = :sql
Christian Lescuyer
+1  A: 

christian is right.

do

config.active_record.schema_format = :sql

in environment.rb

but then you have to use a different schema dump format and file location. try doing your migration and looking for "schema.sql" instead of scehema.rb

the reason for all of this is that the point of the scheme file is a database unspecific (works for all types of databases) file. so when you use features which only work on mysql through an unsupoorted execute statement, they can't be shoehorned in to schema.rb

+4  A: 

I too expected to see a new .sql file appear after a "rake db:migrate", once I set

config.active_record.schema_format = :sql

in config/environment.rb.

Apparently that's not how it works, however. I have to do this explicitly to get a db/[development|test|production]_structure.sql file:

rake db:structure:dump
Pete TerMaat
A: 

To use the SQL variant for testing (instead of schema.rb), you'll need to use

rake db:test:clone_structure

Our schema uses UUIDs (uuid gem) and also Red Hill on Rails (RHoR) nice FK plug-in. Unfortunately, the FKs require PKs that can only be added using EXECUTES in the migrations.

It's well known that these executes do not make it to the schema.rb; however, it was harder to find the rake alternative to db:test:prepare for apps that cannot use schema.rb.

RAVolt
A: 

Just an update for those on Rails 3 (beta 4, currently) - Christian's solution is still correct, only the correct place to put the line is in config/application.rb, under the scope of the Application class which should be defined in a module named after your Rails project.

Dave Foster
Nice DHH hair in your icon
dasil003