forked from pingcap/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprimary_group_lookup.rb
41 lines (32 loc) · 932 Bytes
/
primary_group_lookup.rb
1
2
3
4
5
6
7
8
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
37
38
39
40
41
# frozen_string_literal: true
class PrimaryGroupLookup
def initialize(user_ids = [])
@user_ids = user_ids.tap(&:compact!).tap(&:uniq!).tap(&:flatten!)
end
# Lookup primary group for a given user id
def [](user_id)
users[user_id]
end
private
def self.lookup_columns
@lookup_columns ||= %i{id name flair_url flair_bg_color flair_color}
end
def users
@users ||= user_lookup_hash
end
def user_lookup_hash
users_with_primary_group = User.where(id: @user_ids)
.where.not(primary_group_id: nil)
.select(:id, :primary_group_id)
group_lookup = {}
group_ids = users_with_primary_group.map(&:primary_group_id)
group_ids.uniq!
Group.where(id: group_ids).select(self.class.lookup_columns)
.each { |g| group_lookup[g.id] = g }
hash = {}
users_with_primary_group.each do |u|
hash[u.id] = group_lookup[u.primary_group_id]
end
hash
end
end