Ruby on rails Ruby Rails按最新评论对用户索引列表进行排序

Ruby on rails Ruby Rails按最新评论对用户索引列表进行排序,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个发布评论的用户列表。我试图以不同的方式对列表进行排序。我一直坚持按每个用户最近的评论对列表进行排序 我目前的方法是创建一个模型范围。我就是不明白 这就是模型: class User < ApplicationRecord attr_accessor :password validates_confirmation_of :password validates :email, :presence => true, :uniqueness => true v

我有一个发布评论的用户列表。我试图以不同的方式对列表进行排序。我一直坚持按每个用户最近的评论对列表进行排序

我目前的方法是创建一个模型范围。我就是不明白

这就是模型:

class User < ApplicationRecord
  attr_accessor :password
  validates_confirmation_of :password
  validates :email, :presence => true, :uniqueness => true
  validates :user_name, :presence => true, :uniqueness => true
  before_save :encrypt_password
  
  has_many :reviews
  has_one_attached :avatar_pic


  scope :users_most_recent, -> {(
    select('users.id, users.user_name')
    .joins(:reviews).where('reviews.updated_at')
    .group('users.id')
    .order('updated_at DESC')
    )}


  def self.user_reviews(user_id)
    @user_reviews = Review.where(user_id: user_id).count
  end

  def self.user_ave_rating(user_id)
    _average_reviews = []
    _rev_count = 0
    _new_average = 0.0
    _average_reviews = Review.where(user_id: user_id)
    _average_reviews.each do |average_review|
      _rev_count += average_review.rating
    end
    _new_average = (_rev_count / _average_reviews.length.to_f).round(1)
  end

  def self.user_latest_review(user_id)
    @latest_review = Review.where(user_id: user_id).where('created_at < ? ', Time.now).order('created_at DESC').first
    if @latest_review.nil?
      last_review = {}
      else
        last_review = @latest_review.created_at.strftime('%m-%d-%Y')
    end
  end

  def encrypt_password
    self.password_salt = BCrypt::Engine.generate_salt
    self.password_hash = BCrypt::Engine.hash_secret(password,password_salt)
  end

  def self.authenticate(email, password)
    user = User.find_by "email = ?", email
    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
      user
    else
      nil
    end
  end

end
class用户true,:university=>true
验证:用户名,:presence=>true,:university=>true
保存前:加密密码
有很多评论吗
有一个附件:阿凡达图片
范围:用户\u最近\u最近,->{(
选择('users.id,users.user\u name')
.joins(:reviews).where('reviews.updated_at')
.group('users.id')
.order('在DESC更新了_')
)}
定义自我用户审核(用户id)
@user\u reviews=Review.where(user\u id:user\u id).count
结束
定义自我用户平均等级(用户id)
_平均审查数=[]
_rev_计数=0
_新平均值=0.0
_average_reviews=Review.where(用户\u id:用户\u id)
_平均审查。每个人都做平均审查|
_修订计数+=平均审查评级
结束
_新平均值=(_rev_count/_average_reviews.length.to_f.)四舍五入(1)
结束
定义自我用户最新审查(用户id)
@latest_review=review.where(用户id:user_id)。where('created_at<?',Time.now)。order('created_at DESC')。首先
如果@latest_review.nil?
上次审查={}
其他的
last_review=@last_review.created_于.strftime(“%m-%d-%Y”)
结束
结束
def加密密码
self.password\u salt=BCrypt::Engine.generate\u salt
self.password\u hash=BCrypt::Engine.hash\u secret(密码、密码)
结束
def自我验证(电子邮件、密码)
user=user.find_by“email=?”,email
如果user&&user.password\u hash==BCrypt::Engine.hash\u secret(密码,user.password\u salt)
用户
其他的
无
结束
结束
结束
这是控制器,索引是我试图实现的地方:

class UsersController < ApplicationController
  before_action :current_user, only: [:show, :edit, :update, :destroy]
  
  def new
    @user = User.new
  end
  
  def create
    @user = User.new(user_params)
    @user.avatar_pic.attach(params[:user][:avatar_pic])
    if @user.save
      flash[:notice] = "You've successfully signed up!"
      session[:user_id] = @user.id
      redirect_to "/"
    else
      flash[:alert] = "There was a problem signing up."
      redirect_to '/signup'
    end
  end

  def show
    @user = current_user
    render :show
  end  

  def edit
    @user = current_user
    render :edit
  end  

  def update
    @user = current_user

    if @user.update(user_params)
      flash[:notice] = "Profile successfully updated!"
      redirect_to user_path(@user)
    else
      render :edit
      flash[:notice] = "Something went wrong. Please contact Mario's technical assistance staff."
    end
  end

  def index
    case
    when params[:az]
      @users = User.order('user_name').paginate(page: params[:page], per_page: 20)
    when params[:za]
      @users = User.order('user_name DESC').paginate(page: params[:page], per_page: 20)
    when params[:high_rating]
      "High Rating"
    when params[:low_rating]
      "Low Rating"
    when params[:most_reviews]
      "Most Reviews"
    when params[:least_reviews]
      "Least Reviews"
    when params[:most_recent]
      @users = User.users_most_recent.paginate(page: params[:page], per_page: 20)
    when params[:least_recent]
      "Least Recent"
    else
      @users = User.all.paginate(page: params[:page], per_page: 20)
    end
    render :index
  end
  
  

  private
  
  def user_params
    params.require(:user).permit(:email, :user_name, :password, :password_confirmation, :admin, :avatar_pic)
  end
end
class UsersController
我的看法是:

<p id="notice"><%= notice %></p>

<div class="sort-flex-wrapper">
  <h1 class="center">Our Community</h1>

  <div class="btn-group sort-button">
    <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
      Sort By
    </button>
    <div class="dropdown-menu">

      <%= link_to "User Name A-Z", users_path(:az => 'az'), class: "dropdown-item" %>
      <%= link_to "User Name Z-A", users_path(:za => 'za'), class: "dropdown-item" %>
      <%= link_to "Highest Average Rating", users_path(:high_rating => 'high_rating'), class: "dropdown-item" %>
      <%= link_to "Lowest Average Rating", users_path(:low_rating => 'low_rating'), class: "dropdown-item" %>
      <%= link_to "Most Reviews", users_path(:most_reviews => 'most_reviews'), class: "dropdown-item" %>
      <%= link_to "Least Reviews", users_path(:least_reviews => 'least_reviews'), class: "dropdown-item" %>
      <%= link_to "Most Recent Review", users_path(:most_recent => 'most_recent'), class: "dropdown-item" %>
      <%= link_to "Least Recent Review", users_path(:least_recent => 'least_recent'), class: "dropdown-item" %>

    </div>
  </div>
</div>

<div class="community-flex-container">
  <% if @users.any? %>
    <% @users.each do |user| %>

      <div class="community-profile-card">
        <div class="community-profile-flex">

          <div class="community-profile-box1">
            <% if user.avatar_pic.attached? %>
              <%= image_tag user.avatar_pic, class:"avatar" %><br>
              <% else %>
                <%= image_tag 'generc_profile_pic.webp', class:"avatar", alt: 'Avatar Not Found ' %><br>
            <% end %>
          </div>

          <div class="community-profile-box2">
            <div class="community-column-box1">
              <% if user.user_name? %>
                <h3><%= user.user_name %></h3>
                <% else %>
                <h3>Guest User</h3>
              <% end %>
            </div>

            <div class="community-column-box2">
              <div class="community-align-stars"> 
                <p>Average Rating: </p>              
              </div>
              <div class="community-align-stars">
                <div class="star-align">
                  <%= render partial: "shared/review_stars", locals: { review: User.user_ave_rating(user.id) } %>
                </div>
              </div>                  
            </div>

            <div class="community-column-box3">
              <p>Number of Reviews: <%= User.user_reviews(user.id) %></p>
            </div>

            <div class="community-column-box4">
              <% if User.user_latest_review(user.id) == {} %>
                <p>Most Recent Review: None</p>
                <% else %>
                  <p>Most Recent Review: <%= User.user_latest_review(user.id) %></p>
              <% end %>
            </div>
            
          </div>
        </div>
      </div> 

    <% end %>

  <% else %>
    <p>There are no users (yet).</p>
  <% end %>
</div>
<div class="pagination">
  <%= will_paginate @reviews%>
</div>

我们的社区 排序 'az'),类别:“下拉项”%> “za”),类:“下拉项”%> “高_评级”),类别:“下拉项”%> “低评级”),类别:“下拉项目”%> “most_评论”),类:“下拉项”%> “最少审查”),类别:“下拉项”%> “最近”,类别:“下拉项”%> “最新”,类别:“下拉项”%>

来宾用户 平均评分:

审查次数:

最新评论:无

最近的审查:

目前还没有用户


好吧,既然这样做了,我们还不如修复整个索引方法。您在控制器中做了很多事情,将其拆分为如下内容:

class UserList
  def self.order_users_by(order_value)
    case order_value
    when :az
      User.order('user_name ASC')
    when :za
      User.order('user_name DESC')
    when :high_rating
      User.all.sort_by(&:average_rating).reverse
    when :low_rating
      User.all.sort_by(&:average_rating)
    when :most_reviews
      User.all.sort_by(&:review_count).reverse
    when :least_reviews
      User.all.sort_by(&:review_count)
    else
      User.all.sort_by(&:last_updated_review)
    end
  end
end

class User   
  def average_rating
    (BigDecimal(reviews.sum(:rating).to_s) / BigDecimal(reviews.count.to_s)).round(1)
  end

  def review_count
    reviews.count
  end

  def last_updated_review
    reviews.order("updated_at")
  end
end

class UsersController < ApplicationController
  def index
    UserList.order_users_by(params).paginate(page: params[:page], per_page: 20)
  end
end
类用户列表
定义自订单用户(订单值)
案例顺序值
时间:az
User.order('User\u name ASC')
时间:za
User.order('User\u name DESC')
时间:高等级
User.all.sort_by(&:average_rating)。反向
时间:低等级
User.all.sort按(&:平均评分)
什么时候:大多数评论
User.all.sort_by(&:review_count)。反向
时间:最短时间
User.all.sort_by(&:review_count)
其他的
User.all.sort_by(&:last_updated_review)
结束
结束
结束
类用户
def平均额定值
(BigDecimal(reviews.sum(:rating.to_s)/BigDecimal(reviews.count.to_s))。四舍五入(1)
结束
def复查计数
点评数
结束
def上次更新的检查
评论.顺序(“
class UserList
  def self.order_users_by(order_value)
    case order_value
    when :az
      User.order('user_name ASC')
    when :za
      User.order('user_name DESC')
    when :high_rating
      User.all.sort_by(&:average_rating).reverse
    when :low_rating
      User.all.sort_by(&:average_rating)
    when :most_reviews
      User.all.sort_by(&:review_count).reverse
    when :least_reviews
      User.all.sort_by(&:review_count)
    else
      User.all.sort_by(&:last_updated_review)
    end
  end
end

class User   
  def average_rating
    (BigDecimal(reviews.sum(:rating).to_s) / BigDecimal(reviews.count.to_s)).round(1)
  end

  def review_count
    reviews.count
  end

  def last_updated_review
    reviews.order("updated_at")
  end
end

class UsersController < ApplicationController
  def index
    UserList.order_users_by(params).paginate(page: params[:page], per_page: 20)
  end
end