/
fixtures.rb
51 lines (42 loc) · 1.26 KB
/
fixtures.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
ActiveRecord::Schema.define do
create_table :whiteboards, force: true do |t|
t.string :content
t.boolean :someone_wrote_do_not_erase_on_me, default: false, null: false
end
create_table :classrooms, force: true do |t|
t.references :whiteboard, foreign_key: true
end
end
class Classroom < ActiveRecord::Base
belongs_to :whiteboard, dependent: :destroy
end
class AnnoyingCoworkerMessageEraser
def dry_erase(model)
if model.someone_wrote_do_not_erase_on_me?
model.errors.add(:someone_wrote_do_not_erase_on_me, "so I can't erase it")
end
end
end
class ForeignKeyEraser
def initialize(foreign_model, foreign_key)
@foreign_model = foreign_model
@foreign_key = foreign_key
end
def dry_erase(model)
if @foreign_model.where(@foreign_key => model).exists?
model.errors.add(@foreign_key, "is still in use")
end
end
end
class Whiteboard < ActiveRecord::Base
has_one :classroom
dry_erase :must_have_content, AnnoyingCoworkerMessageEraser
dry_erase ->(model) { model.content == "🖍️" && model.errors.add(:base, "No crayon, c'mon!") }
dry_erase ForeignKeyEraser.new(Classroom, :whiteboard)
private
def must_have_content
if content.blank?
errors.add(:content, "must have content")
end
end
end