Class: UserProfileView

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/user_profile_view.rb

Class Method Summary collapse

Class Method Details

.add(user_profile_id, ip, user_id = nil, at = nil, skip_redis = false) ⇒ Object



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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/models/user_profile_view.rb', line 8

def self.add(, ip, user_id = nil, at = nil, skip_redis = false)
  at ||= Time.zone.now
  redis_key = +"user-profile-view:#{}:#{at.to_date}"
  if user_id
    return if user_id < 1
    redis_key << ":user-#{user_id}"
    ip = nil
  else
    redis_key << ":ip-#{ip}"
  end

  if skip_redis || Discourse.redis.setnx(redis_key, "1")
    skip_redis ||
      Discourse.redis.expire(redis_key, SiteSetting..hours)

    self.transaction do
      sql =
        "INSERT INTO user_profile_views (user_profile_id, ip_address, viewed_at, user_id)
             SELECT :user_profile_id, :ip_address, :viewed_at, :user_id
             WHERE NOT EXISTS (
                SELECT 1 FROM user_profile_views
                /*where*/
             )"

      builder = DB.build(sql)

      if !user_id
        builder.where(
          "viewed_at = :viewed_at AND ip_address = :ip_address AND user_profile_id = :user_profile_id AND user_id IS NULL",
        )
      else
        builder.where(
          "viewed_at = :viewed_at AND user_id = :user_id AND user_profile_id = :user_profile_id",
        )
      end

      result =
        builder.exec(
          user_profile_id: ,
          ip_address: ip,
          viewed_at: at,
          user_id: user_id,
        )

      UserProfile.find().increment!(:views) if result > 0
    end
  end
end

.profile_views_by_day(start_date, end_date, group_id = nil) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
# File 'app/models/user_profile_view.rb', line 57

def self.profile_views_by_day(start_date, end_date, group_id = nil)
  profile_views = self.where("viewed_at >= ? AND viewed_at < ?", start_date, end_date + 1.day)
  if group_id
    profile_views =
      profile_views.joins("INNER JOIN users ON users.id = user_profile_views.user_id")
    profile_views =
      profile_views.joins("INNER JOIN group_users ON group_users.user_id = users.id")
    profile_views = profile_views.where("group_users.group_id = ?", group_id)
  end
  profile_views.group("date(viewed_at)").order("date(viewed_at)").count
end