Module: Mongoid::Rateable::ClassMethods

Defined in:
lib/mongoid_rateable/rateable.rb

Instance Method Summary collapse

Instance Method Details

#default_rater(rater = nil, &block) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/mongoid_rateable/rateable.rb', line 86

def default_rater rater=nil, &block
  case rater
  when Symbol, String
    define_method :default_rater do
      self.send(rater) # fx to use owner or user relation
    end
  when nil
    return unless block_given?
    define_method :default_rater do
      self.instance_eval(&block)
    end
  else
    raise ArgumentError, "Must take symbol or block argument"
  end
end

#in_rating_range?(value) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
# File 'lib/mongoid_rateable/rateable.rb', line 46

def in_rating_range?(value)
  range = rating_range if respond_to?(:rating_range)
  range ? range.include?(value.to_i) : true
end

#rate_config(options = {}, &block) ⇒ Object



80
81
82
83
84
# File 'lib/mongoid_rateable/rateable.rb', line 80

def rate_config options = {}, &block
  set_rating_range options[:range]
  rateable_by options[:raters]
  default_rater options[:default_rater], &block
end

#rateable_by(*clazzes) ⇒ Object



71
72
73
74
75
76
77
78
# File 'lib/mongoid_rateable/rateable.rb', line 71

def rateable_by *clazzes
  @rater_classes = []
  return if clazzes.compact.empty?
  clazzes.each do |clazz|
    raise ArgumentError, "A rateable must be a class, was: #{clazz}" unless clazz.respond_to?(:new)
    @rater_classes << clazz
  end
end

#rater_classesObject



37
38
39
# File 'lib/mongoid_rateable/rateable.rb', line 37

def rater_classes
  @rater_classes ||= []
end

#set_rating_range(range = nil) ⇒ Object

macro to create dynamic :rating_range class method! can now even take an Array and find the range of values!



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/mongoid_rateable/rateable.rb', line 53

def set_rating_range range = nil
  raterange = case range
  when Array
    arr = range.sort
    Range.new arr.first, arr.last
  when Range
    range
  when nil
    (1..5)
  else
    raise ArgumentError, "Must be a range, was: #{range}"
  end

  (class << self; self; end).send(:define_method, :rating_range) do
    raterange
  end
end

#valid_rater_class?(clazz) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
44
# File 'lib/mongoid_rateable/rateable.rb', line 41

def valid_rater_class? clazz
  return true if !rater_classes || rater_classes.empty?
  rater_classes.include? clazz
end