]> git.openstreetmap.org Git - rails.git/commitdiff
Add note and diary comments counts to the user profile
authorNenad Vujicic <nenadus@gmail.com>
Mon, 3 Jun 2024 12:58:23 +0000 (14:58 +0200)
committerNenad Vujicic <nenadus@gmail.com>
Fri, 7 Jun 2024 19:20:42 +0000 (21:20 +0200)
Fixes #1643

app/models/diary_comment.rb
app/models/note_comment.rb
app/models/user.rb
app/views/users/show.html.erb
db/migrate/20240605134916_add_notes_and_diary_comments_counter_caches.rb [new file with mode: 0644]
db/structure.sql

index 55d2c3c84af76790de21916109eb0bacc31199a8..a88c69f12ee3b3d8db208fa6405569e7dee5af15 100644 (file)
@@ -23,7 +23,7 @@
 #
 
 class DiaryComment < ApplicationRecord
-  belongs_to :user
+  belongs_to :user, :counter_cache => true
   belongs_to :diary_entry
 
   scope :visible, -> { where(:visible => true) }
index b870e5558e557b2f2c337586206daf5ac6b8c356..d318c5e95aa8272332765437da303c1234970fd6 100644 (file)
@@ -26,7 +26,7 @@
 
 class NoteComment < ApplicationRecord
   belongs_to :note, :touch => true
-  belongs_to :author, :class_name => "User", :optional => true
+  belongs_to :author, :class_name => "User", :optional => true, :counter_cache => true
 
   validates :id, :uniqueness => true, :presence => { :on => :update },
                  :numericality => { :on => :update, :only_integer => true }
index e4067a350fe822dac17a0adfd90d0f4b8cb43c63..4241a9e5687b0e4d71876794dd3fd41e6aacb2f1 100644 (file)
@@ -2,35 +2,37 @@
 #
 # Table name: users
 #
-#  email               :string           not null
-#  id                  :bigint(8)        not null, primary key
-#  pass_crypt          :string           not null
-#  creation_time       :datetime         not null
-#  display_name        :string           default(""), not null
-#  data_public         :boolean          default(FALSE), not null
-#  description         :text             default(""), not null
-#  home_lat            :float
-#  home_lon            :float
-#  home_zoom           :integer          default(3)
-#  pass_salt           :string
-#  email_valid         :boolean          default(FALSE), not null
-#  new_email           :string
-#  creation_ip         :string
-#  languages           :string
-#  status              :enum             default("pending"), not null
-#  terms_agreed        :datetime
-#  consider_pd         :boolean          default(FALSE), not null
-#  auth_uid            :string
-#  preferred_editor    :string
-#  terms_seen          :boolean          default(FALSE), not null
-#  description_format  :enum             default("markdown"), not null
-#  changesets_count    :integer          default(0), not null
-#  traces_count        :integer          default(0), not null
-#  diary_entries_count :integer          default(0), not null
-#  image_use_gravatar  :boolean          default(FALSE), not null
-#  auth_provider       :string
-#  home_tile           :bigint(8)
-#  tou_agreed          :datetime
+#  email                :string           not null
+#  id                   :bigint(8)        not null, primary key
+#  pass_crypt           :string           not null
+#  creation_time        :datetime         not null
+#  display_name         :string           default(""), not null
+#  data_public          :boolean          default(FALSE), not null
+#  description          :text             default(""), not null
+#  home_lat             :float
+#  home_lon             :float
+#  home_zoom            :integer          default(3)
+#  pass_salt            :string
+#  email_valid          :boolean          default(FALSE), not null
+#  new_email            :string
+#  creation_ip          :string
+#  languages            :string
+#  status               :enum             default("pending"), not null
+#  terms_agreed         :datetime
+#  consider_pd          :boolean          default(FALSE), not null
+#  auth_uid             :string
+#  preferred_editor     :string
+#  terms_seen           :boolean          default(FALSE), not null
+#  description_format   :enum             default("markdown"), not null
+#  changesets_count     :integer          default(0), not null
+#  traces_count         :integer          default(0), not null
+#  diary_entries_count  :integer          default(0), not null
+#  image_use_gravatar   :boolean          default(FALSE), not null
+#  auth_provider        :string
+#  home_tile            :bigint(8)
+#  tou_agreed           :datetime
+#  diary_comments_count :integer          default(0)
+#  note_comments_count  :integer          default(0)
 #
 # Indexes
 #
index 2c40cfebed99c2183451910ca675c28e6eed62bd..c73581b25a8493d4d6edcbbc43dbfd4cf4afdf71 100644 (file)
@@ -14,7 +14,8 @@
               <span class='badge count-number'><%= number_with_delimiter(current_user.changesets.size) %></span>
             </li>
             <li>
-              <%= link_to t(".my notes"), user_notes_path(@user) %>
+              <%= link_to t(".my notes"), user_notes_path(current_user) %>
+              <span class='badge count-number'><%= number_with_delimiter(current_user.note_comments.size) %></span>
             </li>
             <li>
               <%= link_to t(".my traces"), :controller => "traces", :action => "mine" %>
@@ -26,6 +27,7 @@
             </li>
             <li>
               <%= link_to t(".my comments"), diary_comments_path(current_user) %>
+              <span class='badge count-number'><%= number_with_delimiter(current_user.diary_comments.size) %></span>
             </li>
             <li>
               <%= link_to t(".my settings"), edit_account_path %>
@@ -59,6 +61,7 @@
             </li>
             <li>
               <%= link_to t(".notes"), user_notes_path(@user) %>
+              <span class='badge count-number'><%= number_with_delimiter(@user.note_comments.size) %></span>
             </li>
             <li>
               <%= link_to t(".traces"), :controller => "traces", :action => "index", :display_name => @user.display_name %>
@@ -76,6 +79,7 @@
             </li>
             <li>
               <%= link_to t(".comments"), diary_comments_path(@user) %>
+              <span class='badge count-number'><%= number_with_delimiter(@user.diary_comments.size) %></span>
             </li>
             <li>
               <% if current_user and current_user.friends_with?(@user) %>
diff --git a/db/migrate/20240605134916_add_notes_and_diary_comments_counter_caches.rb b/db/migrate/20240605134916_add_notes_and_diary_comments_counter_caches.rb
new file mode 100644 (file)
index 0000000..6b30071
--- /dev/null
@@ -0,0 +1,30 @@
+class AddNotesAndDiaryCommentsCounterCaches < ActiveRecord::Migration[7.1]
+  class DiaryComment < ApplicationRecord
+  end
+
+  class NoteComment < ApplicationRecord
+  end
+
+  class User < ApplicationRecord
+  end
+
+  def self.up
+    add_column :users, :diary_comments_count, :integer, :default => 0
+    add_column :users, :note_comments_count, :integer, :default => 0
+
+    users_with_diary_comments = DiaryComment.distinct.pluck(:user_id)
+    users_with_diary_comments.each do |user_id|
+      User.reset_counters(user_id, :diary_comments)
+    end
+
+    users_with_note_comments = NoteComment.where.not(:author_id => nil).distinct.pluck(:author_id)
+    users_with_note_comments.each do |author_id|
+      User.reset_counters(author_id, :note_comments)
+    end
+  end
+
+  def self.down
+    remove_column :users, :diary_comments_count
+    remove_column :users, :note_comments_count
+  end
+end
index 829595e7c7431afc17946a7a57e8d14fb93bc71e..2e8bdbb61b9f6cf5666c181125474f9ebb7d3e4e 100644 (file)
@@ -1565,7 +1565,9 @@ CREATE TABLE public.users (
     image_use_gravatar boolean DEFAULT false NOT NULL,
     auth_provider character varying,
     home_tile bigint,
-    tou_agreed timestamp without time zone
+    tou_agreed timestamp without time zone,
+    diary_comments_count integer DEFAULT 0,
+    note_comments_count integer DEFAULT 0
 );
 
 
@@ -3519,6 +3521,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('23'),
 ('22'),
 ('21'),
+('20240605134916'),
 ('20240405083825'),
 ('20240307181018'),
 ('20240307180830'),