lib/leaderboard.rb in leaderboard-3.10.0 vs lib/leaderboard.rb in leaderboard-3.11.0
- old
+ new
@@ -217,10 +217,30 @@
# @return String of optional member data.
def member_data_for_in(leaderboard_name, member)
@redis_connection.hget(member_data_key(leaderboard_name), member)
end
+ # Retrieve the optional member data for a given member in the named leaderboard.
+ #
+ # @param leaderboard_name [String] Name of the leaderboard.
+ # @param members [Array] Member names.
+ #
+ # @return array of strings of optional member data.
+ def members_data_for_in(leaderboard_name, members)
+ return [] unless members.size > 0
+ @redis_connection.hmget(member_data_key(leaderboard_name), *members)
+ end
+
+ # Retrieve the optional member data for the given members in the leaderboard.
+ #
+ # @param members [Array] Member names.
+ #
+ # @return array of strings of optional member data.
+ def members_data_for(members)
+ members_data_for_in(@leaderboard_name, members)
+ end
+
# Update the optional member data for a given member in the leaderboard.
#
# @param member [String] Member name.
# @param member_data [String] Optional member data.
def update_member_data(member, member_data)
@@ -858,11 +878,11 @@
# @param position [int] Position in named leaderboard.
# @param options [Hash] Options to be used when retrieving the member from the named leaderboard.
#
# @return a page of leaders from the named leaderboard.
def member_at_in(leaderboard_name, position, options = {})
- if position <= total_members_in(leaderboard_name)
+ if position > 0 && position <= total_members_in(leaderboard_name)
leaderboard_options = DEFAULT_LEADERBOARD_REQUEST_OPTIONS.dup
leaderboard_options.merge!(options)
page_size = validate_page_size(leaderboard_options[:page_size]) || @page_size
current_page = (position.to_f / page_size.to_f).ceil
offset = (position - 1) % page_size
@@ -962,14 +982,16 @@
next unless leaderboard_options[:include_missing]
end
data[@score_key] = responses[index * 2 + 1].to_f if responses[index * 2 + 1]
end
- if leaderboard_options[:with_member_data]
- data[@member_data_key] = member_data_for_in(leaderboard_name, member)
- end
-
ranks_for_members << data
+ end
+
+ if leaderboard_options[:with_member_data]
+ members_data_for_in(leaderboard_name, members).each_with_index do |member_data, index|
+ ranks_for_members[index][@member_data_key] = member_data
+ end
end
case leaderboard_options[:sort_by]
when :rank
ranks_for_members = ranks_for_members.sort_by { |member| member[@rank_key] }