lib/markable/acts_as_markable.rb in markable-0.0.4 vs lib/markable/acts_as_markable.rb in markable-0.0.5
- old
+ new
@@ -1,62 +1,54 @@
module Markable
module ActsAsMarkable
extend ActiveSupport::Concern
- included do |a|
- end
-
module ClassMethods
def markable_as(marks, options = {})
- Markable.set_models ActiveRecord::Base.connection.tables.collect{|t| t.classify rescue nil }.compact
+ Markable.set_models
- cattr_accessor :markable_marks
+ cattr_accessor :markable_marks, :instance_writer => false
- if options[:by]
- markers = options[:by].kind_of?(Array) ? options[:by].map { |i| i.to_sym } : [ options[:by].to_sym ]
- else
- markers = :all
- end
+ marks = Array.wrap(marks).map!{|i| i.to_sym }
+ markers = options[:by].present? ? Array.wrap(options[:by]) : :all
+
self.markable_marks ||= {}
- marks = [ marks ] unless marks.kind_of? Array
marks.each { |mark|
- self.markable_marks[ mark.to_sym ] = {
+ self.markable_marks[mark] = {
:allowed_markers => markers
}
}
- class_eval do
+ class_eval {
has_many :markable_marks, :class_name => 'Markable::Mark', :as => :markable
include Markable::ActsAsMarkable::MarkableInstanceMethods
def self.marked_as mark, options = {}
- if options[:by]
+ if options[:by].present?
result = self.joins(:markable_marks).where( :marks => { :mark => mark, :marker_id => options[:by].id, :marker_type => options[:by].class.name } )
markable = self
result.class_eval do
define_method :<< do |object|
- if object.kind_of?(markable) || (object.kind_of?(Array) && object.all?{ |i| i.kind_of?(markable) })
- options[:by].set_mark mark, object
- else
- raise Markable::WrongMarkableType.new
- end
+ options[:by].set_mark mark, object
+ self
end
define_method :delete do |markable|
options[:by].remove_mark mark, markable
+ self
end
end
else
result = self.joins(:markable_marks).where( :marks => { :mark => mark } )
end
- result
+ result.group("#{self.table_name}.id")
end
- end
+ }
self.markable_marks.each { |mark, o|
class_eval %(
- def self.marked_as_#{mark}(options = {})
+ def self.marked_as_#{mark} options = {}
self.marked_as :#{mark}, options
end
def marked_as_#{mark}? options = {}
self.marked_as? :#{mark}, options
@@ -68,46 +60,43 @@
end
end
module MarkableInstanceMethods
def mark_as(mark, markers)
- markers = [ markers ] unless markers.kind_of? Array
- markers.each { |marker|
+ Array.wrap(markers).each { |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
}
Markable::Mark.create( params ) unless Markable::Mark.exists?( params )
}
- true
end
def marked_as?(mark, options = {})
- if options[:by]
+ if options[:by].present?
Markable.can_mark_or_raise? options[:by], self, mark
end
params = {
:markable_id => self.id,
:markable_type => self.class.name,
:mark => mark
}
- if options[:by]
+ if options[:by].present?
params[:marker_id] = options[:by].id
params[:marker_type] = options[:by].class.name
end
Markable::Mark.exists?( params )
end
def unmark mark, options = {}
- if options[:by]
+ if options[:by].present?
Markable.can_mark_or_raise? options[:by], self, mark
- markers = options[:by].kind_of?(Array) ? options[:by] : [ options[:by] ]
- markers.each { |marker|
+ Array.wrap(options[:by]).each { |marker|
params = {
:markable_id => self.id,
:markable_type => self.class.name,
:marker_id => marker.id,
:marker_type => marker.class.name,
@@ -121,27 +110,24 @@
:markable_type => self.class.name,
:mark => mark
}
Markable::Mark.delete_all(params)
end
- true
end
def have_marked_as_by(mark, target)
result = target.joins(:marker_marks).where( :marks => { :mark => mark, :markable_id => self.id, :markable_type => self.class.name } )
markable = self
result.class_eval do
define_method :<< do |markers|
- markers = [ markers ] unless markers.kind_of? Array
- markers.each { |marker|
+ Array.wrap(markers).each { |marker|
marker.set_mark mark, markable
}
self
end
define_method :delete do |markers|
Markable.can_mark_or_raise? markers, markable, mark
- markers = [ markers ] unless markers.kind_of? Array
- markers.each { |marker|
+ Array.wrap(markers).each { |marker|
marker.remove_mark mark, markable
}
self
end
end