Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: creating a custom data type / creating a shorthand

I am wondering how I could create a custom data type to use within the rake migration file. Example: if you would be creating a model, inside the migration file you can add columns. It could look like this:

  def self.up
    create_table :products do |t|
      t.column :name, :string
      t.timestamps
    end
  end

I would like to know how to create something like this:

t.column :name, :my_custom_data_type

The reason for this to create for example a "currency" type, which is nothing more than a decimal with a precision of 8 and a scale of 2. Since I use only MySQL, the solution for this database is sufficient enough.

Thank you for your feedback and comments!

like image 325
Shyam Avatar asked Apr 11 '10 15:04

Shyam


1 Answers

What you're looking to do is define a new column creation method that provides the options to create your custom type. Which is essentially done by adding a method that behaves like t.integer ... in migrations. The trick is figuring out where to add that code.

Some where in your initializers directory place this snippet of code:

module ActiveRecord::ConnectionAdapters
  class TableDefinition
    def currency (*args)
      options = args.extract_options!
      column_names = args
      options[:precision] ||= 8
      options[:scale] ||= 2
      column_names.each { |name| column(name, 'decimal', options) }
    end                                                                     
  end
end

Now you can use the currency method do define a currency column any time you need it.

Example:

def self.up
  create_table :products do |t|
    t.currency :cost
    t.timestamps
  end
end

To add a currency column to an existing table:

def self.up
  change_table :products do |t|
    t.currency :sell_price
  end
end   

Caveat: I haven't time to test it, so there's no guarantees. If it doesn't work, it should at least put you on the right track.

like image 160
EmFi Avatar answered Sep 18 '22 17:09

EmFi