Class: ActiveRecord::ConnectionAdapters::Column

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/connection_adapters/abstract/schema_definitions.rb

Overview

An abstract definition of a column in a table.

Direct Known Subclasses

MysqlColumn, PostgreSQLColumn, SQLiteColumn

Defined Under Namespace

Modules: Format

Constant Summary collapse

TRUE_VALUES =
[true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
FALSE_VALUES =
[false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, default, sql_type = nil, null = true) ⇒ Column

Instantiates a new column in the table.

name is the column’s name, such as supplier_id in supplier_id int(11). default is the type-casted default value, such as new in sales_stage varchar(20) default 'new'. sql_type is used to extract the column’s length, if necessary. For example 60 in company_name varchar(60). It will be mapped to one of the standard Rails SQL types in the type attribute. null determines if this column allows NULL values.



30
31
32
33
34
35
36
37
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 30

def initialize(name, default, sql_type = nil, null = true)
  @name, @sql_type, @null = name, sql_type, null
  @limit, @precision, @scale = extract_limit(sql_type), extract_precision(sql_type), extract_scale(sql_type)
  @type = simplified_type(sql_type)
  @default = extract_default(default)

  @primary = nil
end

Instance Attribute Details

#defaultObject (readonly)

Returns the value of attribute default.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def default
  @default
end

#limitObject (readonly)

Returns the value of attribute limit.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def limit
  @limit
end

#nameObject (readonly)

Returns the value of attribute name.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def name
  @name
end

#nullObject (readonly)

Returns the value of attribute null.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def null
  @null
end

#precisionObject (readonly)

Returns the value of attribute precision.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def precision
  @precision
end

#primaryObject

Returns the value of attribute primary.



20
21
22
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 20

def primary
  @primary
end

#scaleObject (readonly)

Returns the value of attribute scale.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def scale
  @scale
end

#sql_typeObject (readonly)

Returns the value of attribute sql_type.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def sql_type
  @sql_type
end

#typeObject (readonly)

Returns the value of attribute type.



19
20
21
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 19

def type
  @type
end

Class Method Details

.binary_to_string(value) ⇒ Object

Used to convert from BLOBs to Strings



124
125
126
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 124

def binary_to_string(value)
  value
end

.string_to_binary(value) ⇒ Object

Used to convert from Strings to BLOBs



119
120
121
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 119

def string_to_binary(value)
  value
end

.string_to_date(string) ⇒ Object



128
129
130
131
132
133
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 128

def string_to_date(string)
  return string unless string.is_a?(String)
  return nil if string.empty?

  fast_string_to_date(string) || fallback_string_to_date(string)
end

.string_to_dummy_time(string) ⇒ Object



142
143
144
145
146
147
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 142

def string_to_dummy_time(string)
  return string unless string.is_a?(String)
  return nil if string.empty?

  string_to_time "2000-01-01 #{string}"
end

.string_to_time(string) ⇒ Object



135
136
137
138
139
140
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 135

def string_to_time(string)
  return string unless string.is_a?(String)
  return nil if string.empty?

  fast_string_to_time(string) || fallback_string_to_time(string)
end

.value_to_boolean(value) ⇒ Object

convert something to a boolean



150
151
152
153
154
155
156
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 150

def value_to_boolean(value)
  if value.is_a?(String) && value.blank?
    nil
  else
    TRUE_VALUES.include?(value)
  end
end

.value_to_decimal(value) ⇒ Object

convert something to a BigDecimal



159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 159

def value_to_decimal(value)
  # Using .class is faster than .is_a? and
  # subclasses of BigDecimal will be handled
  # in the else clause
  if value.class == BigDecimal
    value
  elsif value.respond_to?(:to_d)
    value.to_d
  else
    value.to_s.to_d
  end
end

Instance Method Details

#extract_default(default) ⇒ Object



113
114
115
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 113

def extract_default(default)
  type_cast(default)
end

#has_default?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 49

def has_default?
  !default.nil?
end

#human_nameObject

Returns the human name of the column name.

Examples
Column.new('sales_stage', ...).human_name # => 'Sales stage'


109
110
111
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 109

def human_name
  Base.human_attribute_name(@name)
end

#klassObject

Returns the Ruby class that corresponds to the abstract data type.



54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 54

def klass
  case type
    when :integer       then Fixnum
    when :float         then Float
    when :decimal       then BigDecimal
    when :datetime      then Time
    when :date          then Date
    when :timestamp     then Time
    when :time          then Time
    when :text, :string then String
    when :binary        then String
    when :boolean       then Object
  end
end

#number?Boolean

Returns true if the column is either of type integer, float or decimal.

Returns:

  • (Boolean)


45
46
47
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 45

def number?
  type == :integer || type == :float || type == :decimal
end

#text?Boolean

Returns true if the column is either of type string or text.

Returns:

  • (Boolean)


40
41
42
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 40

def text?
  type == :string || type == :text
end

#type_cast(value) ⇒ Object

Casts value (which is a String) to an appropriate instance.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 70

def type_cast(value)
  return nil if value.nil?
  case type
    when :string    then value
    when :text      then value
    when :integer   then value.to_i rescue value ? 1 : 0
    when :float     then value.to_f
    when :decimal   then self.class.value_to_decimal(value)
    when :datetime  then self.class.string_to_time(value)
    when :timestamp then self.class.string_to_time(value)
    when :time      then self.class.string_to_dummy_time(value)
    when :date      then self.class.string_to_date(value)
    when :binary    then self.class.binary_to_string(value)
    when :boolean   then self.class.value_to_boolean(value)
    else value
  end
end

#type_cast_code(var_name) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_record/connection_adapters/abstract/schema_definitions.rb', line 88

def type_cast_code(var_name)
  case type
    when :string    then nil
    when :text      then nil
    when :integer   then "(#{var_name}.to_i rescue #{var_name} ? 1 : 0)"
    when :float     then "#{var_name}.to_f"
    when :decimal   then "#{self.class.name}.value_to_decimal(#{var_name})"
    when :datetime  then "#{self.class.name}.string_to_time(#{var_name})"
    when :timestamp then "#{self.class.name}.string_to_time(#{var_name})"
    when :time      then "#{self.class.name}.string_to_dummy_time(#{var_name})"
    when :date      then "#{self.class.name}.string_to_date(#{var_name})"
    when :binary    then "#{self.class.name}.binary_to_string(#{var_name})"
    when :boolean   then "#{self.class.name}.value_to_boolean(#{var_name})"
    else nil
  end
end