def options_for_tally (options = {})
options.assert_valid_keys :start_at, :end_at, :conditions, :at_least, :at_most, :order, :limit
scope = scope(:find)
start_at = sanitize_sql(["#{Vote.table_name}.created_at >= ?", options.delete(:start_at)]) if options[:start_at]
end_at = sanitize_sql(["#{Vote.table_name}.created_at <= ?", options.delete(:end_at)]) if options[:end_at]
type_and_context = "#{Vote.table_name}.voteable_type = #{quote_value(base_class.name)}"
conditions = [
type_and_context,
options[:conditions],
start_at,
end_at
]
conditions = conditions.compact.join(' AND ')
conditions = merge_conditions(conditions, scope[:conditions]) if scope
joins = ["LEFT OUTER JOIN #{Vote.table_name} ON #{table_name}.#{primary_key} = #{Vote.table_name}.voteable_id"]
joins << scope[:joins] if scope && scope[:joins]
at_least = sanitize_sql(["COUNT(#{Vote.table_name}.id) >= ?", options.delete(:at_least)]) if options[:at_least]
at_most = sanitize_sql(["COUNT(#{Vote.table_name}.id) <= ?", options.delete(:at_most)]) if options[:at_most]
having = [at_least, at_most].compact.join(' AND ')
group_by = "#{Vote.table_name}.voteable_id HAVING COUNT(#{Vote.table_name}.id) > 0"
group_by << " AND #{having}" unless having.blank?
{ :select => "#{table_name}.*, COUNT(#{Vote.table_name}.id) AS count",
:joins => joins.join(" "),
:conditions => conditions,
:group => group_by
}.update(options)
end