ruby-on-rails - 从 RoR 中的同一模型获取两个索引请求的最佳方法是什么?
问题描述
我有一个有很多评论的 WorkSpace 模型。在评论模型中,我有一个使用整数作为编号评级的评级列。
我想列出来自 WorkSpace 模型的所有内容,并根据模型的整体审查评级work_spaces
列出前 5名。work_spaces
在我的控制器中,我有一个索引方法,可以很好地检索所有工作空间。
工作区控制器# GET /work_spaces
def index
@work_spaces = WorkSpace.all
render json: @work_spaces
end
通过将我的逻辑放置在我的 work_space 模型中,我成功地检索了评分最高的 work_spaces。
工作区class WorkSpace < ApplicationRecord
belongs_to :user
has_many :reviews, dependent: :delete_all
acts_as_votable
scope :by_average_for, ->(column) {
joins(:reviews)
.group('work_spaces.id')
.order("AVG(reviews.#{column}) desc")
.having("AVG(reviews.#{column}) > 4", column) if column
}
def top_avg_rating
WorkSpace.by_average_for(:rating).limit(5)
end
我通过我的序列化程序发送此信息,它很容易访问,但它附加到每个索引的工作空间。我不需要将信息附加到每个工作空间。我最终只需要在应用程序最初加载时获取此信息。
我认为只需在 WorkSpaces 控制器中对该信息运行 GET 请求就足够简单了,因此我尝试将此方法添加到控制器中。
工作区控制器 def top_rated
@work_spaces = WorkSpace.by_average_for(:rating).limit(5)
render json: @work_spaces
end
我试图为它写一条新路线,但我不知道该怎么做。我在我的路线上试过这个。
get 'top_rated', to: 'work_spaces#top_rated'
我的道路是http://localhost:4741/work_spaces/top_rated
这回应:
在 2020-04-26 23:35:38 -0400 开始 GET "/work_spaces/top_rated" for ::1 由 WorkSpacesController#show as / 参数处理:{"id"=>"top_rated"} 用户负载 (0.4ms) SELECT "users".* FROM "users" WHERE "users"."token" = $1 LIMIT $2 [["token", "3bbddce2b4c8f7e6a79a62f56ad9229a"], ["LIMIT", 1]] WorkSpace Load (0.4ms) SELECT "work_spaces ".* FROM "work_spaces" WHERE "work_spaces"."id" = $1 LIMIT $2 [["id", 0], ["LIMIT", 1]] [active_model_serializers] 使用哈希渲染 ActiveModel::Serializer::Null ( 0.06ms) 完成 404 Not Found in 16ms (Views: 2.6ms | ActiveRecord: 3.1ms)
在我看来,参数正在寻找用于显示工作空间的 ID。
我用 top_rated 方法替换了我原来的索引方法并且效果很好,但我似乎无法让两个索引同时工作。
我应该将逻辑留在模型中吗?我想知道这种逻辑的最佳实践是什么。提前感谢您能给我的任何帮助或指导。
更新
感谢NemyaNation ,我得到了这个工作。
我将 routes.rb 中的路线更改为get '/work_spaces/top_rated' => 'work_spaces#top_rated'
直到我将路线移到其他一些路线之上,这才奏效。
# frozen_string_literal: true
Rails.application.routes.draw do
resources :reviews, except: %i[new edit]
get '/work_spaces/top_rated' => 'work_spaces#top_rated'
resources :work_spaces, except: %i[new edit]
# RESTful routes
resources :examples, except: %i[new edit]
resources :work_spaces do
member do
put 'like', to: 'work_spaces#upvote'
put 'unlike', to: 'work_spaces#downvote'
get 'likes', to: 'work_spaces#like'
end
end
# Custom routes
post '/sign-up' => 'users#signup'
post '/sign-in' => 'users#signin'
delete '/sign-out' => 'users#signout'
patch '/change-password' => 'users#changepw'
patch '/update-user' => 'users#update'
end
不是 100% 确定为什么会这样……但是使用rake routes
来检查我的可用路线非常有帮助,并让我更好地了解路线。
我发现一些有用的链接:
解决方案
您到 top_rated 定义的路径是错误的。
更改您的 routes.rb 以显示:
get 'work_spaces/top_rated', to: 'work_spaces#top_rated'
使用该命令rake routes
向您展示如何正确构建您的路线。
推荐阅读
- wso2 - Wso2 XACML 获取自定义属性
- python - 获得固定精度:在使用 Google Colab 的 Keras 模型中为 0.5000,有时为 0.0000e+00
- ios - 如何在 Xcode 12.5.1 或 Xcode 13 中使用 OSLog?
- wix - 显示许可证文件和复选框的自定义背景图像
- wordpress - 如何成功实现 WooCommerce REST API“orderby”?
- javascript - 在浏览器中出现错误 - 无法为范围注册 ServiceWorker
- r - 具有 row_number、ifelse 和 mutate 的 dplyr
- python - 谷歌云 - Python 自动化
- firebase - 如何在 Flutter 中管理不同的 Firebase 环境?
- r - r 中数字值和分类值的混合之间的点积(余弦相似度)