Module: Markable::ActsAsMarkable::MarkableInstanceMethods

Defined in:
lib/markable/acts_as_markable.rb

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_sym, *args) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/markable/acts_as_markable.rb', line 83

def method_missing(method_sym, *args)
  Markable.models.each do |model_name|
    if method_sym.to_s =~ Regexp.new("^#{model_name.downcase.pluralize}_have_marked_as(_[\\w_]+)?$")
      model_name.constantize # ping model

      if self.methods.include?(method_sym) # method has appear
        return self.method(method_sym).call(*args) # call this method
      end
    end
  end
  super
rescue
  super
end

Instance Method Details

#have_marked_as_by(mark, target) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/markable/acts_as_markable.rb', line 149

def have_marked_as_by(mark, target)
  result = target.joins(:marker_marks).where({
    :marks => {
      :mark => mark.to_s,
      :markable_id => self.id,
      :markable_type => self.class.name
    }
  })
  markable = self
  result.class_eval do
    define_method :<< do |markers|
      Array.wrap(markers).each do |marker|
        marker.set_mark(mark, markable)
      end
      self
    end
    define_method :delete do |markers|
      Markable.can_mark_or_raise?(markers, markable, mark)
      Array.wrap(markers).each do |marker|
        marker.remove_mark(mark, markable)
      end
      self
    end
  end
  result
end

#mark_as(mark, markers) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/markable/acts_as_markable.rb', line 98

def mark_as(mark, markers)
  Array.wrap(markers).each do |marker|
    Markable.can_mark_or_raise?(marker, self, mark)
    params = {
      :markable_id => self.id,
      :markable_type => self.class.name,
      :marker_id => marker.id,
      :marker_type => marker.class.name,
      :mark => mark.to_s
    }
    Markable::Mark.create(params) unless Markable::Mark.exists?(params)
  end
end

#marked_as?(mark, options = {}) ⇒ Boolean

Returns:

  • (Boolean)


112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/markable/acts_as_markable.rb', line 112

def marked_as?(mark, options = {})
  by = options[:by]
  params = {
    :markable_id => self.id,
    :markable_type => self.class.name,
    :mark => mark.to_s
  }
  if by.present?
    Markable.can_mark_or_raise?(by, self, mark)
    params[:marker_id] = by.id
    params[:marker_type] = by.class.name
  end
  Markable::Mark.exists?(params)
end

#unmark(mark, options = {}) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/markable/acts_as_markable.rb', line 127

def unmark(mark, options = {})
  by = options[:by]
  if by.present?
    Markable.can_mark_or_raise?(by, self, mark)
    Array.wrap(by).each do |marker|
      Markable::Mark.delete_all({
        :markable_id => self.id,
        :markable_type => self.class.name,
        :marker_id => marker.id,
        :marker_type => marker.class.name,
        :mark => mark.to_s
      })
    end
  else
    Markable::Mark.delete_all({
      :markable_id => self.id,
      :markable_type => self.class.name,
      :mark => mark.to_s
    })
  end
end