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
|
# File 'lib/marks/marker.rb', line 6
def marks_with(*types)
has_many :outgoing_marks, as: :marker, dependent: :destroy, class_name: 'Marks::Mark'
class_eval do
define_method :'marks' do |markable, mark, options = {}|
classified_mark = mark.to_s.classify
raise ArgumentError unless types.map { |t| t.to_s.classify }.include?(classified_mark)
return if options[:unique] && self.marks?(markable, mark)
Marks::Mark.create do |c|
c.mark_type = classified_mark
c.marker = self
c.markable = markable
end
end
define_method :'marks?' do |markable, mark|
classified_mark = mark.to_s.classify
raise ArgumentError unless types.map { |t| t.to_s.classify }.include?(classified_mark)
if markable.has_attribute?('type')
markable_type = markable.class.base_class.name
else
markable_type = markable.class.name
end
outgoing_marks.where(mark_type: classified_mark, markable_type: markable_type, markable_id: markable).any?
end
define_method :'unmarks' do |markable, mark|
classified_mark = mark.to_s.classify
raise ArgumentError unless types.map { |t| t.to_s.classify }.include?(classified_mark)
if markable.has_attribute?('type')
markable_type = markable.class.base_class.name
else
markable_type = markable.class.name
end
outgoing_marks.where(mark_type: classified_mark, markable_type: markable_type, markable_id: markable).destroy_all
end
define_method :'markings' do |markable_class, mark|
classified_mark = mark.to_s.classify
raise ArgumentError unless types.map { |t| t.to_s.classify }.include?(classified_mark)
outgoing_marks.where(mark_type: classified_mark, markable_type: markable_class.name)
end
end
end
|