| Class | ActiveRecord::ConnectionAdapters::Column |
| In: |
vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
|
| Parent: | Object |
An abstract definition of a column in a table.
| TRUE_VALUES | = | [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set |
| default | [R] | |
| limit | [R] | |
| name | [R] | |
| null | [R] | |
| precision | [R] | |
| primary | [RW] | |
| scale | [R] | |
| sql_type | [R] | |
| type | [R] |
Used to convert from BLOBs to Strings
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 118
118: def binary_to_string(value)
119: value
120: 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 only used to extract the column‘s length, if necessary. For example +60+ in company_name varchar(60). null determines if this column allows NULL values.
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 26
26: def initialize(name, default, sql_type = nil, null = true)
27: @name, @sql_type, @null = name, sql_type, null
28: @limit, @precision, @scale = extract_limit(sql_type), extract_precision(sql_type), extract_scale(sql_type)
29: @type = simplified_type(sql_type)
30: @default = extract_default(default)
31:
32: @primary = nil
33: end
Used to convert from Strings to BLOBs
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 113
113: def string_to_binary(value)
114: value
115: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 122
122: def string_to_date(string)
123: return string unless string.is_a?(String)
124: return nil if string.empty?
125:
126: fast_string_to_date(string) || fallback_string_to_date(string)
127: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 136
136: def string_to_dummy_time(string)
137: return string unless string.is_a?(String)
138: return nil if string.empty?
139:
140: string_to_time "2000-01-01 #{string}"
141: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 129
129: def string_to_time(string)
130: return string unless string.is_a?(String)
131: return nil if string.empty?
132:
133: fast_string_to_time(string) || fallback_string_to_time(string)
134: end
convert something to a boolean
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 144
144: def value_to_boolean(value)
145: if value.is_a?(String) && value.blank?
146: nil
147: else
148: TRUE_VALUES.include?(value)
149: end
150: end
convert something to a BigDecimal
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 153
153: def value_to_decimal(value)
154: # Using .class is faster than .is_a? and
155: # subclasses of BigDecimal will be handled
156: # in the else clause
157: if value.class == BigDecimal
158: value
159: elsif value.respond_to?(:to_d)
160: value.to_d
161: else
162: value.to_s.to_d
163: end
164: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 200
200: def fallback_string_to_date(string)
201: new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
202: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 204
204: def fallback_string_to_time(string)
205: time_hash = Date._parse(string)
206: time_hash[:sec_fraction] = microseconds(time_hash)
207:
208: new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
209: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 186
186: def fast_string_to_date(string)
187: if string =~ Format::ISO_DATE
188: new_date $1.to_i, $2.to_i, $3.to_i
189: end
190: end
Doesn‘t handle time zones.
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 193
193: def fast_string_to_time(string)
194: if string =~ Format::ISO_DATETIME
195: microsec = ($7.to_f * 1_000_000).to_i
196: new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
197: end
198: end
‘0.123456’ -> 123456 ‘1.123456’ -> 123456
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 169
169: def microseconds(time)
170: ((time[:sec_fraction].to_f % 1) * 1_000_000).to_i
171: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 173
173: def new_date(year, mon, mday)
174: if year && year != 0
175: Date.new(year, mon, mday) rescue nil
176: end
177: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 179
179: def new_time(year, mon, mday, hour, min, sec, microsec)
180: # Treat 0000-00-00 00:00:00 as nil.
181: return nil if year.nil? || year == 0
182:
183: Time.time_with_datetime_fallback(Base.default_timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
184: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 107
107: def extract_default(default)
108: type_cast(default)
109: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 43
43: def has_default?
44: !default.nil?
45: end
Returns the human name of the column name.
Column.new('sales_stage', ...).human_name # => 'Sales stage'
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 103
103: def human_name
104: Base.human_attribute_name(@name)
105: end
Returns the Ruby class that corresponds to the abstract data type.
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 48
48: def klass
49: case type
50: when :integer then Fixnum
51: when :float then Float
52: when :decimal then BigDecimal
53: when :datetime then Time
54: when :date then Date
55: when :timestamp then Time
56: when :time then Time
57: when :text, :string then String
58: when :binary then String
59: when :boolean then Object
60: end
61: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 39
39: def number?
40: type == :integer || type == :float || type == :decimal
41: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 35
35: def text?
36: type == :string || type == :text
37: end
Casts value (which is a String) to an appropriate instance.
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 64
64: def type_cast(value)
65: return nil if value.nil?
66: case type
67: when :string then value
68: when :text then value
69: when :integer then value.to_i rescue value ? 1 : 0
70: when :float then value.to_f
71: when :decimal then self.class.value_to_decimal(value)
72: when :datetime then self.class.string_to_time(value)
73: when :timestamp then self.class.string_to_time(value)
74: when :time then self.class.string_to_dummy_time(value)
75: when :date then self.class.string_to_date(value)
76: when :binary then self.class.binary_to_string(value)
77: when :boolean then self.class.value_to_boolean(value)
78: else value
79: end
80: end
# File vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 82
82: def type_cast_code(var_name)
83: case type
84: when :string then nil
85: when :text then nil
86: when :integer then "(#{var_name}.to_i rescue #{var_name} ? 1 : 0)"
87: when :float then "#{var_name}.to_f"
88: when :decimal then "#{self.class.name}.value_to_decimal(#{var_name})"
89: when :datetime then "#{self.class.name}.string_to_time(#{var_name})"
90: when :timestamp then "#{self.class.name}.string_to_time(#{var_name})"
91: when :time then "#{self.class.name}.string_to_dummy_time(#{var_name})"
92: when :date then "#{self.class.name}.string_to_date(#{var_name})"
93: when :binary then "#{self.class.name}.binary_to_string(#{var_name})"
94: when :boolean then "#{self.class.name}.value_to_boolean(#{var_name})"
95: else nil
96: end
97: end