Module: Markable::ActsAsMarkable::ClassMethods

Defined in:
lib/markable/acts_as_markable.rb

Instance Method Summary collapse

Instance Method Details

#markable_as(*args) ⇒ 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
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.extract_options!
  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