An abstract definition of a column in a table.
- binary_to_string
- extract_default
- fallback_string_to_date
- fallback_string_to_time
- fast_string_to_date
- fast_string_to_time
- has_default?
- human_name
- klass
- microseconds
- new
- new_date
- new_time
- number?
- string_to_binary
- string_to_date
- string_to_dummy_time
- string_to_time
- text?
- type_cast
- type_cast_code
- value_to_boolean
- value_to_decimal
TRUE_VALUES | = | [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set |
FALSE_VALUES | = | [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set |
[R] | name | |
[R] | default | |
[R] | type | |
[R] | limit | |
[R] | null | |
[R] | sql_type | |
[R] | precision | |
[R] | scale | |
[RW] | primary |
Used to convert from BLOBs to Strings
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 124 def binary_to_string(value) value end
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.
[ show source ]
# File activerecord/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
Used to convert from Strings to BLOBs
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 119 def string_to_binary(value) value end
[ show source ]
# File activerecord/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
[ show source ]
# File activerecord/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
[ show source ]
# File activerecord/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
convert something to a boolean
[ show source ]
# File activerecord/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
convert something to a BigDecimal
[ show source ]
# File activerecord/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
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 206 def fallback_string_to_date(string) new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday)) end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 210 def fallback_string_to_time(string) time_hash = Date._parse(string) time_hash[:sec_fraction] = microseconds(time_hash) new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction)) end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 192 def fast_string_to_date(string) if string =~ Format::ISO_DATE new_date $1.to_i, $2.to_i, $3.to_i end end
Doesn’t handle time zones.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 199 def fast_string_to_time(string) if string =~ Format::ISO_DATETIME microsec = ($7.to_f * 1_000_000).to_i new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec end end
‘0.123456’ -> 123456 ‘1.123456’ -> 123456
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 175 def microseconds(time) ((time[:sec_fraction].to_f % 1) * 1_000_000).to_i end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 179 def new_date(year, mon, mday) if year && year != 0 Date.new(year, mon, mday) rescue nil end end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 185 def new_time(year, mon, mday, hour, min, sec, microsec) # Treat 0000-00-00 00:00:00 as nil. return nil if year.nil? || year == 0 Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 113 def extract_default(default) type_cast(default) end
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 49 def has_default? !default.nil? end
Returns the human name of the column name.
Examples
Column.new('sales_stage', ...).human_name # => 'Sales stage'
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 109 def human_name Base.human_attribute_name(@name) end
Returns the Ruby class that corresponds to the abstract data type.
[ show source ]
# File activerecord/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
Returns true if the column is either of type integer, float or decimal.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 45 def number? type == :integer || type == :float || type == :decimal end
Returns true if the column is either of type string or text.
[ show source ]
# File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 40 def text? type == :string || type == :text end
Casts value (which is a String) to an appropriate instance.
[ show source ]
# File activerecord/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
[ show source ]
# File activerecord/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