[Ruby on Rails] Fonction de classement des scores (affichage complet)

Cible

--Classement des messages des utilisateurs

Environnement de développement

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

supposition

Ajouter une colonne

Ajouté pour donner une note dans les commentaires de l'article.

Terminal


$ rails g migration AddScoreToComments score:integer

db/migrate/xxxxxxxxxxxxx_add_score_to_comments.rb


class AddScoreToComments < ActiveRecord::Migration[5.2]
  def change
    add_column :comments, :score, :integer, default: 0
  end
end

Si rien n'est fait, il y aura une différence de points, donc Décrit afin que le score puisse être sélectionné dans la vue.

erb:app/views/posts/show.html.erb


Évaluation:<%= f.number_field :score,min:1,max:5 %>

Lorsque vous donnez la valeur totale


<% @sum = 0 %>
<% @post.comments.each do |comment| %>
  <% @sum += comment.score %>
<% end %>
<%= @sum %>

Lors du calcul de la valeur moyenne


<% @average = 0 %>
<% @post.comments.each do |comment| %>
  <% @average += (comment.score / @user.comments.count) %>
<% end %>
<%= @average %>

Maintenant que nous sommes prêts, passons au sujet principal.

controller Le contrôleur est la clé.

Classement de la valeur totale: application/controllers/users_controller.rb


  def rank
    @users = User.
              left_joins(:comments).
              distinct.
              sort_by do |user|
                hoges = user.comments
                if hoges.present?
                  hoges.map(&:score).sum
                else
                  0
                end
              end.
              reverse
  end

Classement moyen: application/controllers/users_controller.rb


  def rank
    @users = User.
              left_joins(:comments).
              distinct.
              sort_by do |user|
                hoges = user.comments
                if hoges.present?
                  hoges.map(&:score).sum / hoges.size
                else
                  0
                end
              end.
              reverse
  end

<détails>

Supplément </ summary> -Left_joins (: comments): Obtenez tous les utilisateurs associés aux commentaires en disant jointures externes à gauche. S'il n'y a pas de commentaire, c'est une méthode pour obtenir null. Cette explication est facile à comprendre. [Rails] Quelle est la jointure externe gauche définie par la méthode left_joins? -Distinct: Une méthode pour combiner des enregistrements en double en un seul. Dans ce cas, s'il y a deux commentaires ou plus, l'utilisateur en recevra également deux ou plus, donc Utilisé pour éviter la duplication. · Trier_by do |user|: Une méthode pour trier le tableau dans l'ordre croissant. En tant que valeur, remplacez-la dans les conditions après if. -Map (&: score): une méthode qui ajoute uniquement la valeur du score. Cette explication est facile à comprendre. La signification de arr.map (&: id) souvent vue dans Rails -Reverse: Sort_by est utilisé pour trier par ordre croissant, donc il est inversé. Cependant, si les nombres sont les mêmes, l'ordre sera le plus récent, alors soyez prudent. Je le mettrai à jour à nouveau si je peux le résoudre. -Hoges.size: Le nombre de hoges est acquis. La moyenne est calculée en fonction de ce nombre.

view Peut être affiché dans l'ordre décroissant de chacun comme indiqué ci-dessous Après avoir créé app / views / users / rank.html.erb

erb:app/views/users/rank.html.erb


<% @users.each do |user| %>
  <%= link_to user_path(user) do %>
    <%= user.name %><br>
  <% end %>
<% end %>

routing

config/routes.rb


get '/rank', to: 'users#rank'

Site de référence

[Fonction de classement facile avec Rails] (https://qiita.com/mitsumitsu1128/items/18fa5e49a27e727f00b4) [Rails] Implémentation de la fonction de classement

Résumé

Cette fois, je voulais montrer aux utilisateurs qui ont publié des scores élevés, alors Bien que ce soit devenu une telle description, Ce n'est peut-être pas très pratique. Cependant, si vous utilisez ces classements, Uniquement pour ceux qui apprécient le score ou uniquement pour ceux qui ont un score faible Je pense que c'est un classement favorable aux ventes car vous pouvez adopter une approche.

De plus, si vous souhaitez mettre en œuvre un classement de bouche à oreille, etc. pour le classement par score des publications, Je pense que ce sera une description pratique.

Recommended Posts

[Ruby on Rails] Fonction de classement des scores (affichage complet)
[Ruby on Rails] Affichage du classement (total, valeur moyenne)
[Ruby on Rails] Communication asynchrone de la fonction de publication, ajax
[Ruby on Rails] Introduction de la fonction de pagination
[Ruby on Rails] Fonction de sortie CSV
[Ruby on Rails] Implémentation de la fonction de commentaire
[Ruby on Rails] DM, fonction de chat
[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle
[Ruby on Rails] Fonction de publication que seuls les utilisateurs connectés peuvent publier
[Ruby on rails] Implémentation d'une fonction similaire
[Ruby on Rails] Suppression logique (fonction de retrait)
Paramètres de validation pour la fonction de connexion Ruby on Rails
Implémentation de la fonction de connexion Ruby on Rails (Session)
Ruby on Rails Implémentation de la fonction d'envoi automatique de courrier
[Ruby on Rails] Fonction de post-édition (mise à jour, suppression)
[Ruby on Rails] Affichage individuel des messages d'erreur
[rails] fonction de classement des balises
Ruby on Rails élémentaire
Principes de base de Ruby on Rails
Association Ruby On Rails
Implémentation de la fonction de connexion Ruby on Rails (édition de devise)
[Ruby on Rails] Fonction de prévisualisation de l'image dans le fichier
[Ruby on Rails] Fonction de recherche (modèle, formule de sélection de méthode)
Record d'apprentissage de Ruby on rails -2020.10.03
Création de portfolio Ruby on Rails
Record d'apprentissage Ruby on rails -2020.10.04
Record d'apprentissage de Ruby on rails -2020.10.09
Record d'apprentissage Ruby on rails-2020.10.07 ②
Record d'apprentissage Ruby on rails-2020.10.07 ①
Annuler la migration de Ruby on Rails
Record d'apprentissage de Ruby on rails -2020.10.06
[Rails] Implémenter la fonction de publication d'images
Résumé de la validation Ruby on Rails
Mémorandum de base Ruby on Rails
Ruby on Rails Paramètre de la fonction d'envoi automatique des e-mails (avec Gmail)
[Ruby on Rails] Afficher rapidement le titre de la page dans le navigateur
(Ruby on Rails6) Affichage de la base de données qui a obtenu l'identifiant de la base de données
Une note sur la fonction de départ de Ruby on Rails
[Ruby on Rails] Implémenter la fonction de connexion par add_token_to_users avec l'API
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Variables Ruby on Rails, résumé constant
Installation de Ruby + Rails sur Ubuntu 18.04 (rbenv)
Je souhaite ajouter une fonction de navigation avec ruby on rails
Connaissance de base de Ruby on Rails
Comment utiliser Ruby on Rails
Ruby on Rails compatible japonais-anglais i18n
(Ruby on Rails6) "Effacer" le contenu publié