Module: DBF::Schema
- Included in:
- Table
- Defined in:
- lib/dbf/schema.rb
Overview
The Schema module is mixin for the Table class
Constant Summary collapse
- FORMATS =
[:activerecord, :json, :sequel].freeze
- OTHER_DATA_TYPES =
{ 'Y' => ':decimal, :precision => 15, :scale => 4', 'D' => ':date', 'T' => ':datetime', 'L' => ':boolean', 'M' => ':text', 'B' => ':binary' }.freeze
Instance Method Summary collapse
-
#activerecord_schema ⇒ Object
:nodoc:.
-
#activerecord_schema_definition(column) ⇒ String
ActiveRecord schema definition.
-
#json_schema ⇒ Object
:nodoc:.
- #number_data_type(column) ⇒ Object
-
#schema(format = :activerecord, table_only: false) ⇒ String
Generate an ActiveRecord::Schema.
-
#schema_data_type(column, format = :activerecord) ⇒ Object
:nodoc:.
-
#schema_name(format) ⇒ Object
:nodoc:.
-
#sequel_schema(table_only: false) ⇒ Object
:nodoc:.
-
#sequel_schema_definition(column) ⇒ String
Sequel schema definition.
- #string_data_format(format, column) ⇒ Object
Instance Method Details
#activerecord_schema ⇒ Object
:nodoc:
49 50 51 52 53 54 55 56 57 |
# File 'lib/dbf/schema.rb', line 49 def activerecord_schema(*) # :nodoc: s = "ActiveRecord::Schema.define do\n" s << " create_table \"#{name}\" do |t|\n" columns.each do |column| s << " t.column #{activerecord_schema_definition(column)}" end s << " end\nend" s end |
#activerecord_schema_definition(column) ⇒ String
ActiveRecord schema definition
81 82 83 |
# File 'lib/dbf/schema.rb', line 81 def activerecord_schema_definition(column) "\"#{column.underscored_name}\", #{schema_data_type(column, :activerecord)}\n" end |
#json_schema ⇒ Object
:nodoc:
73 74 75 |
# File 'lib/dbf/schema.rb', line 73 def json_schema(*) # :nodoc: columns.map(&:to_hash).to_json end |
#number_data_type(column) ⇒ Object
104 105 106 |
# File 'lib/dbf/schema.rb', line 104 def number_data_type(column) column.decimal > 0 ? ':float' : ':integer' end |
#schema(format = :activerecord, table_only: false) ⇒ String
Generate an ActiveRecord::Schema
xBase data types are converted to generic types as follows:
-
Number columns with no decimals are converted to :integer
-
Number columns with decimals are converted to :float
-
Date columns are converted to :datetime
-
Logical columns are converted to :boolean
-
Memo columns are converted to :text
-
Character columns are converted to :string and the :limit option is set to the length of the character column
Example:
create_table "mydata" do |t|
t.column :name, :string, :limit => 30
t.column :last_update, :datetime
t.column :is_active, :boolean
t.column :age, :integer
t.column :notes, :text
end
38 39 40 41 42 43 |
# File 'lib/dbf/schema.rb', line 38 def schema(format = :activerecord, table_only: false) schema_method_name = schema_name(format) send(schema_method_name, table_only: table_only) rescue NameError raise ArgumentError, ":#{format} is not a valid schema. Valid schemas are: #{FORMATS.join(', ')}." end |
#schema_data_type(column, format = :activerecord) ⇒ Object
:nodoc:
93 94 95 96 97 98 99 100 101 102 |
# File 'lib/dbf/schema.rb', line 93 def schema_data_type(column, format = :activerecord) # :nodoc: case column.type when 'N', 'F', 'I' number_data_type(column) when 'Y', 'D', 'T', 'L', 'M', 'B' OTHER_DATA_TYPES[column.type] else string_data_format(format, column) end end |
#schema_name(format) ⇒ Object
:nodoc:
45 46 47 |
# File 'lib/dbf/schema.rb', line 45 def schema_name(format) # :nodoc: "#{format}_schema" end |
#sequel_schema(table_only: false) ⇒ Object
:nodoc:
59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/dbf/schema.rb', line 59 def sequel_schema(table_only: false) # :nodoc: s = '' s << "Sequel.migration do\n" unless table_only s << " change do\n " unless table_only s << " create_table(:#{name}) do\n" columns.each do |column| s << " column #{sequel_schema_definition(column)}" end s << " end\n" s << " end\n" unless table_only s << "end\n" unless table_only s end |
#sequel_schema_definition(column) ⇒ String
Sequel schema definition
89 90 91 |
# File 'lib/dbf/schema.rb', line 89 def sequel_schema_definition(column) ":#{column.underscored_name}, #{schema_data_type(column, :sequel)}\n" end |
#string_data_format(format, column) ⇒ Object
108 109 110 111 112 113 114 |
# File 'lib/dbf/schema.rb', line 108 def string_data_format(format, column) if format == :sequel ":varchar, :size => #{column.length}" else ":string, :limit => #{column.length}" end end |