module PunchingBag::ActiveRecord::ClassMethods

Constants

DEFAULT_DIRECTION
DIRECTIONS

Public Instance Methods

most_hit(since = nil, limit = 5) click to toggle source

Note: this method will only return items if they have 1 or more hits

# File lib/punching_bag/acts_as_punchable.rb, line 11
def most_hit(since = nil, limit = 5)
  query = joins(:punches).group(Punch.arel_table[:punchable_type], Punch.arel_table[:punchable_id], arel_table[primary_key])
  query = query.where('punches.average_time >= ?', since) unless since.nil?
  query.reorder(Arel.sql('SUM(punches.hits) DESC')).limit(limit)
end
sort_by_popularity(direction = DEFAULT_DIRECTION) click to toggle source

Note: this method will return all items with 0 or more hits direction: Symbol (:asc, or :desc)

# File lib/punching_bag/acts_as_punchable.rb, line 19
def sort_by_popularity(direction = DEFAULT_DIRECTION)
  dir = DIRECTIONS.fetch(
    direction.to_s.downcase.to_sym,
    DIRECTIONS[DEFAULT_DIRECTION]
  )

  query = joins(
    arel_table.join(
      Punch.arel_table, Arel::Nodes::OuterJoin
    ).on(
      Punch.arel_table[:punchable_id].eq(
        arel_table[primary_key]
      ).and(
        Punch.arel_table[:punchable_type].eq(name)
      )
    ).join_sources.first
  )

  query = query.group(arel_table[primary_key])
  query.reorder(Arel.sql("SUM(punches.hits) #{dir}"))
end