The Neurochild wrote:
> On Nov 5, 2:07 pm, Phillip Koebbe <[EMAIL PROTECTED]>
> wrote:
>> if you want to use a char instead of a character varying, you can
>> override native_database_types to include a :char definition.
> 
> Really? How do I override it? I'm interested. Sorry if I have many
> trivial questions, but I'm really new to Rails and all this stuff of
> the migrations.
> 

Each database adapter has the ability to define the database types Rails 
uses when building DDL. The method used is native_database_types, which 
is, in the case of PostgreSQL, found in the PostgreSQL class of the 
ConnectionAdapters module of the ActiveRecord module. Override it and 
supply what you want. Here is what I use to add bigint support to AR:

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  # in order to add or change the datatypes, this function
  # must be overriden.  Be careful, then, to not remove anything.
  # That carries with it the warning that if Rails Core changes
  # this function, this override will do away with those changes!
  def native_database_types
    {
      :primary_key => "serial primary key",
      :string      => { :name => "character varying", :limit => 255 },
      :text        => { :name => "text" },
      :integer     => { :name => "integer" },
      :float       => { :name => "float" },
      :decimal     => { :name => "decimal" },
      :datetime    => { :name => "timestamp" },
      :timestamp   => { :name => "timestamp" },
      :time        => { :name => "time" },
      :date        => { :name => "date" },
      :binary      => { :name => "bytea" },
      :boolean     => { :name => "boolean" },
      :bigint      => { :name => "int8" }
    }
  end
end

Put that in a file that gets loaded when the Rails environment gets 
loaded, and you've overridden the method. In your case, if you want to 
add char support, you might do something like:

  def native_database_types
    {
      :primary_key => "serial primary key",
      :char => { :name => "character", :limit => 255 },
      :string      => { :name => "character varying", :limit => 255 },
      :text        => { :name => "text" },
      ...
    }
  end

and then in your migration

t.column :char, :my_column, :limit => 5

in Rails 2.x, you can shorten that to

t.string :my_column

but I haven't figured out how to make that work with the additions I've 
made to native_database_types. So I don't know how to achieve

t.char :my_column

which means you still need to use the older way of t.column <blah blah>

Peace.
-- 
Posted via http://www.ruby-forum.com/.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to