Class ActiveRecord::ConnectionAdapters::TableDefinition
In: vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
Parent: Object

Represents a SQL table in an abstract way. Columns are stored as ColumnDefinition in the columns attribute.

Methods

[]   column   new   primary_key   to_sql  

Attributes

columns  [RW] 

Public Class methods

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 230
230:       def initialize(base)
231:         @columns = []
232:         @base = base
233:       end

Public Instance methods

Returns a ColumnDefinition for the column with name name.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 242
242:       def [](name)
243:         @columns.find {|column| column.name.to_s == name.to_s}
244:       end

Instantiates a new column for the table. The type parameter must be one of the following values: :primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.

Available options are (none of these exists by default):

  • :limit: Requests a maximum column length (:string, :text, :binary or :integer columns only)
  • :default: The column‘s default value. Use nil for NULL.
  • :null: Allows or disallows NULL values in the column. This option could have been named :null_allowed.
  • :precision: Specifies the precision for a :decimal column.
  • :scale: Specifies the scale for a :decimal column.

Please be aware of different RDBMS implementations behavior with :decimal columns:

  • The SQL standard says the default scale should be 0, :scale <= :precision, and makes no comments about the requirements of :precision.
  • MySQL: :precision [1..63], :scale [0..30]. Default is (10,0).
  • PostgreSQL: :precision [1..infinity], :scale [0..infinity]. No default.
  • SQLite2: Any :precision and :scale may be used. Internal storage as strings. No default.
  • SQLite3: No restrictions on :precision and :scale, but the maximum supported :precision is 16. No default.
  • Oracle: :precision [1..38], :scale [-84..127]. Default is (38,0).
  • DB2: :precision [1..63], :scale [0..62]. Default unknown.
  • Firebird: :precision [1..18], :scale [0..18]. Default (9,0). Internal types NUMERIC and DECIMAL have different storage rules, decimal being better.
  • FrontBase?: :precision [1..38], :scale [0..38]. Default (38,0). WARNING Max :precision/:scale for NUMERIC is 19, and DECIMAL is 38.
  • SqlServer?: :precision [1..38], :scale [0..38]. Default (38,0).
  • Sybase: :precision [1..38], :scale [0..38]. Default (38,0).
  • OpenBase?: Documentation unclear. Claims storage in double.

This method returns self.

Examples
 # Assuming td is an instance of TableDefinition
 td.column(:granted, :boolean)
   #=> granted BOOLEAN

 td.column(:picture, :binary, :limit => 2.megabytes)
   #=> picture BLOB(2097152)

 td.column(:sales_stage, :string, :limit => 20, :default => 'new', :null => false)
   #=> sales_stage VARCHAR(20) DEFAULT 'new' NOT NULL

 def.column(:bill_gates_money, :decimal, :precision => 15, :scale => 2)
   #=> bill_gates_money DECIMAL(15,2)

 def.column(:sensor_reading, :decimal, :precision => 30, :scale => 20)
   #=> sensor_reading DECIMAL(30,20)

 # While <tt>:scale</tt> defaults to zero on most databases, it
 # probably wouldn't hurt to include it.
 def.column(:huge_integer, :decimal, :precision => 30)
   #=> huge_integer DECIMAL(30)

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 319
319:       def column(name, type, options = {})
320:         column = self[name] || ColumnDefinition.new(@base, name, type)
321:         column.limit = options[:limit] || native[type.to_sym][:limit] if options[:limit] or native[type.to_sym]
322:         column.precision = options[:precision]
323:         column.scale = options[:scale]
324:         column.default = options[:default]
325:         column.null = options[:null]
326:         @columns << column unless @columns.include? column
327:         self
328:       end

Appends a primary key definition to the table definition. Can be called multiple times, but this is probably not a good idea.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 237
237:       def primary_key(name)
238:         column(name, :primary_key)
239:       end

Returns a String whose contents are the column definitions concatenated together. This string can then be pre and appended to to generate the final SQL to create the table.

[Source]

     # File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 333
333:       def to_sql
334:         @columns * ', '
335:       end

[Validate]