Module: Marks::Marker::ClassMethods

Defined in:
lib/marks/marker.rb

Instance Method Summary collapse

Instance Method Details

#marks_with(*types) ⇒ Object



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