Class: HoboFields::Model::FieldSpec
- Inherits:
-
Object
- Object
- HoboFields::Model::FieldSpec
show all
- Defined in:
- lib/hobo_fields/model/field_spec.rb
Defined Under Namespace
Classes: UnknownSqlTypeError
Constant Summary
collapse
- TYPE_SYNONYMS =
[[:timestamp, :datetime]]
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(model, name, type, options = {}) ⇒ FieldSpec
Returns a new instance of FieldSpec.
8
9
10
11
12
13
14
15
16
|
# File 'lib/hobo_fields/model/field_spec.rb', line 8
def initialize(model, name, type, options={})
raise ArgumentError, "you cannot provide a field spec for the primary key" if name == model.primary_key
self.model = model
self.name = name.to_sym
self.type = type.is_a?(String) ? type.to_sym : type
position = options.delete(:position)
self.options = options
self.position = position || model.field_specs.length
end
|
Instance Attribute Details
#model ⇒ Object
Returns the value of attribute model.
18
19
20
|
# File 'lib/hobo_fields/model/field_spec.rb', line 18
def model
@model
end
|
#name ⇒ Object
Returns the value of attribute name.
18
19
20
|
# File 'lib/hobo_fields/model/field_spec.rb', line 18
def name
@name
end
|
#options ⇒ Object
Returns the value of attribute options.
18
19
20
|
# File 'lib/hobo_fields/model/field_spec.rb', line 18
def options
@options
end
|
#position ⇒ Object
Returns the value of attribute position.
18
19
20
|
# File 'lib/hobo_fields/model/field_spec.rb', line 18
def position
@position
end
|
#type ⇒ Object
Returns the value of attribute type.
18
19
20
|
# File 'lib/hobo_fields/model/field_spec.rb', line 18
def type
@type
end
|
Instance Method Details
65
66
67
|
# File 'lib/hobo_fields/model/field_spec.rb', line 65
def
options[:comment]
end
|
#default ⇒ Object
61
62
63
|
# File 'lib/hobo_fields/model/field_spec.rb', line 61
def default
options[:default]
end
|
#different_to?(col_spec) ⇒ Boolean
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/hobo_fields/model/field_spec.rb', line 80
def different_to?(col_spec)
!same_type?(col_spec) ||
begin
if model.table_exists?
= ActiveRecord::Base.try.column_comment(col_spec.name, model.table_name)
!= nil && !=
else
false
end
end ||
begin
check_attributes = [:null, :default]
check_attributes += [:precision, :scale] if sql_type == :decimal && !col_spec.is_a?(SQLITE_COLUMN_CLASS) check_attributes -= [:default] if sql_type == :text && col_spec.is_a?(MYSQL_COLUMN_CLASS)
check_attributes << :limit if sql_type.in?([:string, :text, :binary, :integer])
check_attributes.any? do |k|
if k==:default && sql_type==:datetime
col_spec.default.try.to_datetime != default.try.to_datetime
else
col_spec.send(k) != self.send(k)
end
end
end
end
|
#limit ⇒ Object
45
46
47
|
# File 'lib/hobo_fields/model/field_spec.rb', line 45
def limit
options[:limit] || native_types[sql_type][:limit]
end
|
#null ⇒ Object
57
58
59
|
# File 'lib/hobo_fields/model/field_spec.rb', line 57
def null
:null.in?(options) ? options[:null] : true
end
|
#precision ⇒ Object
49
50
51
|
# File 'lib/hobo_fields/model/field_spec.rb', line 49
def precision
options[:precision]
end
|
#same_type?(col_spec) ⇒ Boolean
69
70
71
72
73
74
75
76
77
|
# File 'lib/hobo_fields/model/field_spec.rb', line 69
def same_type?(col_spec)
t = sql_type
TYPE_SYNONYMS.each do |synonyms|
if t.in? synonyms
return col_spec.type.in?(synonyms)
end
end
t == col_spec.type
end
|
#scale ⇒ Object
53
54
55
|
# File 'lib/hobo_fields/model/field_spec.rb', line 53
def scale
options[:scale]
end
|
#sql_type ⇒ Object
34
35
36
37
38
39
40
41
42
43
|
# File 'lib/hobo_fields/model/field_spec.rb', line 34
def sql_type
options[:sql_type] or begin
if native_type?(type)
type
else
field_class = HoboFields.to_class(type)
field_class && field_class::COLUMN_TYPE or raise UnknownSqlTypeError, "#{type.inspect} for #{model}.#{name}"
end
end
end
|