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