/
models.rb
171 lines (148 loc) · 4.39 KB
/
models.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
require 'ostruct'
Column = Struct.new(:name, :type, :limit)
Association = Struct.new(:klass, :name, :macro, :options)
class Company < Struct.new(:id, :name)
extend ActiveModel::Naming
include ActiveModel::Conversion
def self.all(options={})
all = (1..3).map{|i| Company.new(i, "Company #{i}")}
return [all.first] if options[:conditions].present?
return [all.last] if options[:order].present?
return all[0..1] if options[:include].present?
return all[1..2] if options[:joins].present?
all
end
def self.merge_conditions(a, b)
(a || {}).merge(b || {})
end
def persisted?
true
end
end
class Tag < Company
extend ActiveModel::Naming
include ActiveModel::Conversion
def self.all(options={})
(1..3).map{|i| Tag.new(i, "Tag #{i}")}
end
end
class User
extend ActiveModel::Naming
include ActiveModel::Conversion
attr_accessor :id, :name, :company, :company_id, :time_zone, :active, :age,
:description, :created_at, :updated_at, :credit_limit, :password, :url,
:delivery_time, :born_at, :special_company_id, :country, :tags, :tag_ids,
:avatar, :home_picture, :email, :status, :residence_country, :phone_number,
:post_count, :lock_version, :amount, :attempts
def initialize(options={})
options.each do |key, value|
send("#{key}=", value)
end if options
end
def new_record!
@new_record = true
end
def persisted?
!(@new_record || false)
end
def company_attributes=(*)
end
def column_for_attribute(attribute)
column_type, limit = case attribute.to_sym
when :name, :status, :password then [:string, 100]
when :description then :text
when :age then :integer
when :credit_limit then [:decimal, 15]
when :active then :boolean
when :born_at then :date
when :delivery_time then :time
when :created_at then :datetime
when :updated_at then :timestamp
when :lock_version then :integer
when :home_picture then :string
when :amount then :integer
when :attempts then :integer
end
Column.new(attribute, column_type, limit)
end
def self.human_attribute_name(attribute)
case attribute
when 'name'
'Super User Name!'
when 'description'
'User Description!'
when 'company'
'Company Human Name!'
else
attribute.humanize
end
end
def self.reflect_on_association(association)
case association
when :company
Association.new(Company, association, :belongs_to, {})
when :tags
Association.new(Tag, association, :has_many, {})
when :first_company
Association.new(Company, association, :has_one, {})
when :special_company
Association.new(Company, association, :belongs_to, { :conditions => { :id => 1 } })
end
end
def errors
@errors ||= begin
hash = Hash.new { |h,k| h[k] = [] }
hash.merge!(
:name => ["can't be blank"],
:description => ["must be longer than 15 characters"],
:age => ["is not a number", "must be greater than 18"],
:company => ["company must be present"],
:company_id => ["must be valid"]
)
end
end
end
class ValidatingUser < User
include ActiveModel::Validations
validates :name, :presence => true
validates :company, :presence => true
validates_numericality_of :age,
:greater_than_or_equal_to => 18,
:less_than_or_equal_to => 99,
:only_integer => true
validates_numericality_of :amount,
:greater_than => :min_amount,
:less_than => :max_amount,
:only_integer => true
validates_numericality_of :attempts,
:greater_than_or_equal_to => :min_attempts,
:less_than_or_equal_to => :max_attempts,
:only_integer => true
def min_amount
10
end
def max_amount
100
end
def min_attempts
1
end
def max_attempts
100
end
end
class OtherValidatingUser < User
include ActiveModel::Validations
validates_numericality_of :age,
:greater_than => 17,
:less_than => 100,
:only_integer => true
validates_numericality_of :amount,
:greater_than => Proc.new { |user| user.age },
:less_than => Proc.new { |user| user.age + 100},
:only_integer => true
validates_numericality_of :attempts,
:greater_than_or_equal_to => Proc.new { |user| user.age },
:less_than_or_equal_to => Proc.new { |user| user.age + 100},
:only_integer => true
end