Forum: Ruby on Rails PostgreSQL specific data types in migrations

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
992f6dd317a9b164e1efc5b674623f38?d=identicon&s=25 Michael Graff (Guest)
on 2009-01-21 16:18
(Received via mailing list)
I am willing to give up the common denominator in database
compatibility and dive into using some PostgreSQL specific types.  In
particular, I need bigint (int8) id columns and 'cidr' data type.

I know I can fake it with a string, but I really want to be able to
use the cidr type's features.  We're not talking about a small
database here; it will likely be huge.

I managed to get a schema created using this:

class CreateProbes < ActiveRecord::Migration
  def self.up
    create_table :probes do |t|
      t.column "target", :cidr
      t.binary :flags
      t.string :status, :limit => 1, :default => 'A'
      t.timestamps
    end
  end

  def self.down
    drop_table :probes
  end
end

which does SOME of it.  However, db/schema.db contains:

ActiveRecord::Schema.define(:version => 20090121052017) do

  create_table "probes", :force => true do |t|
    t.string   "target",     :limit => nil
    t.binary   "flags"
    t.string   "status",     :limit => 1
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

which is NOT what I wanted.  This makes all my "rake test" tests fail.

I looked into part of activerecord, and man is it tricky.  Trying to
get this to work means major changes all over the place from what I
can see.  There aren't any database-specific hooks in place to allow
adding custom types without a lot of monkey patching.

Has anyone already done all this work by chance?

Thanks,
--Michael
C64e63b70be7dfed8b0742540b8b27e5?d=identicon&s=25 Mark Reginald James (Guest)
on 2009-01-22 02:16
(Received via mailing list)
Michael Graff wrote:
> I am willing to give up the common denominator in database
> compatibility and dive into using some PostgreSQL specific types.  In
> particular, I need bigint (int8) id columns and 'cidr' data type.

Can't help you on the cidr, but to change the id to bigint I've used

change_column :probes, :id, :bigint, :limit => 8

after the create_table block.

--
Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com
992f6dd317a9b164e1efc5b674623f38?d=identicon&s=25 Michael Graff (Guest)
on 2009-01-22 03:01
(Received via mailing list)
Thanks for the reply!

It sort of turns out that the development (and anything generated from
a "rake migrate" step) work as intended.  However, it seems that the
test database is created by running db/schema.rb, which has badness.

I know the general work of acriverecord is to maintain as much
database agnostic types as it can, but this is contrary to my reality.
 I choose to use postgresql because it has these features, and not
being able to use them in rails makes my coworkers question the use of
rails, not the use of postgresql.

I'll have to look into ways to contribute back I suppose, and see what
happens.

Types like t.reference would have to change to bigint in my world as
well, or I'll have to create the othertable_id columns as bigint
specially.

--Michael
This topic is locked and can not be replied to.