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
|
# File 'lib/markable/acts_as_markable.rb', line 6
def markable_as(*args)
options = args.
marks = args.flatten
by = options[:by]
Markable.set_models
class_eval do
class << self
attr_accessor :__markable_marks
end
end
marks = Array.wrap(marks).map!(&:to_sym)
markers = by.present? ? Array.wrap(by) : :all
self.__markable_marks ||= {}
marks.each do |mark|
self.__markable_marks[mark] = {
:allowed_markers => markers
}
end
class_eval do
has_many :markable_marks,
:class_name => 'Markable::Mark',
:as => :markable,
:dependent => :delete_all
include Markable::ActsAsMarkable::MarkableInstanceMethods
def self.marked_as(mark, options = {})
by = options[:by]
if by.present?
result = self.joins(:markable_marks).where({
:marks => {
:mark => mark.to_s,
:marker_id => by.id,
:marker_type => by.class.name
}
})
markable = self
result.class_eval do
define_method :<< do |object|
by.set_mark(mark, object)
self
end
define_method :delete do |markable|
by.remove_mark(mark, markable)
self
end
end
else
result = self.joins(:markable_marks).where(:marks => { :mark => mark.to_s }).group("#{self.table_name}.id")
end
result
end
end
self.__markable_marks.each do |mark, o|
class_eval %(
def self.marked_as_#{mark}(options = {})
self.marked_as(:#{mark}, options)
end
def marked_as_#{mark}?(options = {})
self.marked_as?(:#{mark}, options)
end
)
end
Markable.add_markable(self)
end
|