Module: ActsRateable::ClassMethods

Defined in:
lib/acts_rateable/acts_rateable.rb

Instance Method Summary collapse

Instance Method Details

#acts_rateable(options = {}) ⇒ Object



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
# File 'lib/acts_rateable/acts_rateable.rb', line 9

def acts_rateable(options = {})
  if (Rails::VERSION::STRING.to_f >= 4)
    has_many :rates, ->(obj) { where(resource_type: obj.class.base_class.name) }, class_name: ActsRateable::Rate, foreign_key: :resource_id, dependent: :destroy
    has_many :rated, ->(obj) { where(author_type: obj.class.base_class.name) }, class_name: ActsRateable::Rate, foreign_key: :author_id, dependent: :destroy
    has_one :rating, ->(obj) { where(resource_type: obj.class.base_class.name) }, class_name: ActsRateable::Rating, foreign_key: :resource_id, dependent: :destroy
    has_one :count, ->(obj) { where(resource_type: obj.class.base_class.name) }, class_name: ActsRateable::Count, foreign_key: :resource_id, dependent: :destroy
  else
    has_many :rates, class_name: ActsRateable::Rate, conditions: { resource_type: self.base_class.name }, foreign_key: :resource_id, dependent: :destroy
    has_many :rated, class_name: ActsRateable::Rate, conditions: { author_type: self.base_class.name }, foreign_key: :author_id, dependent: :destroy
    has_one :rating, class_name: ActsRateable::Rating, conditions: { resource_type: self.base_class.name }, foreign_key: :resource_id, dependent: :destroy
    has_one :count, class_name: ActsRateable::Count, conditions: { resource_type: self.base_class.name }, foreign_key: :resource_id, dependent: :destroy
  end

  scope :order_by_rating, lambda { | column='estimate', direction="DESC" |
    includes(:rating).group('ar_ratings.id').order("ar_ratings.#{column.downcase} #{direction.upcase}")
  }

  scope :order_by_count, lambda { | column='estimate', direction="DESC" |
    includes(:count).group('ar_ratings.id').order("ar_ratings.#{column.downcase} #{direction.upcase}")
  }

  after_create do
    ActsRateable::Rating.where({resource_id: self.id, resource_type: self.class.base_class.name }).first_or_initialize.save
    ActsRateable::Count.where({resource_id: self.id, resource_type: self.class.base_class.name }).first_or_initialize.save
  end
  
  include LocalInstanceMethods
end