Skip to content
A Ruby library for generating ActiveRecord models from Oracle tables or views
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


= Description
A library for generating an ActiveRecord model from an existing Oracle table.
This will install an "omg" executable that you can use from the command line.

= Synopsis
Using the command line tool:

  omg -d your_database -t locations -u some_user -p some_password

The above command results in a file called "location.rb". This is an
ActiveRecord model declaration, with all validations, primary keys,
table name and belongs_to relationships defined.

If your LOCATIONS table looks like this:

  create table locations(
    location_id number(4,0) primary key,
    street_address varchar2(40), 
    postal_code varchar2(12),
    city varchar2(30) not null
    state_province varchar2(25),
    country_id CHAR(2),
    constraint "LOC_C_ID_FK" FOREIGN KEY (country_id)
      references COUNTRIES (country_id)

The omg library will generate this:

  class Location < ActiveRecord::Base
    set_table_name :locations
    set_primary_key :location_id

    # Table relationships

    belongs_to :countries

    # Validations
    validates :location_id, :presence => true, :numericality => {
      :less_than_or_equal_to => 9999, 
      :greater_than_or_equal_to => -9999,
      :only_integer => true

    validates :street_address, :length => {:maximum => 40}
    validates :postal_code, :length => {:maximum => 12}
    validates :city, :length => {:maximum => 30}, :presence => true
    validates :state_province, :length => {:maximum => 25}
    validates :country_id, :length => {:maximum => 2}

  It will also generate a corresponding test file using test-unit 2 by default.
  For the above example you will see some tests like this:

class TC_Location < Test::Unit::TestCase
  def setup
    @location =

  test 'table name is locations' do
    assert_equal('locations', Location.table_name)

  test 'primary key is location_id' do
    assert_equal('location_id', Location.primary_key)

  test 'location_id basic functionality' do
    assert_respond_to(@location, :location_id)
    assert_nothing_raised{ @location.location_id }
    assert_kind_of(Numeric, @location.location_id)

  test 'location_id must be a number' do
    @location.location_id = 'test_string'
    assert_true(@location.errors[:location_id].include?('is not a number'))

  test 'location_id cannot exceed the value 9999' do
    @location.location_id = 10000
    assert_true(@location.errors[:location_id].include?('must be less than or equal to 9999'))

  # ... and so on.

= Requirements
== Must Have
* ruby-oci8
* getopt

== Optional
If you want to be able to avoid specifying a username and password on the
command line then you will need the dbi-dbrc library.

If you want your models to support multiple primary keys, then you will
need to install the composite_primary_keys library.

If you want date format validations, then you will need to install the
validates_timeliness library.

= What this library doesn't do
I do not attempt to set has_many or has_one relationships. There's no good
way to determine that relationship (one or many?). Besides, in practice I
find that most people set custom has_xxx relationships that go over and
above what's set in the Oracle database anyway for purposes of their

I also do not go out of my way to get the model name correct with regards
to singular vs plural. I do a simple guess that covers most cases, but
complex cases will break it. It's much easier for you to rename a class or
file name than it is for me to get this 100% correct. As of 0.3.1 there's
also the --class option that let's you explicitly set it if you like.

= Author's Comments
I chose not to patch legacy_data because I have no interest in supporting
other vendors other than Oracle with this library. By focusing only on
Oracle I could take advantage of ruby-oci8 features. In addition, I have no
interest in making this a Rails plugin, and I needed the support of multiple
primary keys.

= Future Plans
Add support for views.
Add automatic test suite generation for rspec.
Explicitly set :foreign_key if using CPK in belongs_to relationships.
The output could use a little formatting love.

= Acknowlegements
Thanks go to Daniel Luna for his --class patch.

= Known Issues
None known. If you find any issues, please report them on the github project
page at

= Warranty
This package is provided "as is" and without any express or
implied warranties, including, without limitation, the implied
warranties of merchantability and fitness for a particular purpose.

= Copyright
(C) 2010-2016 Daniel J. Berger
All Rights Reserved

= License
Artistic 2.0

= Author
Daniel J. Berger
You can’t perform that action at this time.