【发布时间】:2020-04-28 00:22:39
【问题描述】:
我的 WorkSpace 模型有_many评论。 在评论模型中,我有一个使用整数作为编号评分的评分列。
我想列出一个 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 年 4 月 26 日 23:35:38 -0400 开始为 ::1 获取“/work_spaces/top_rated” WorkSpacesController 处理#show as / 参数:{"id"=>"top_rated"} 用户负载 (0.4ms) SELECT "users".* FROM "users" WHERE "users"."token" = $1 LIMIT $2 [["token", "3bbddce2b4c8f7e6a79a62f56ad9229a"], ["LIMIT", 1]] 工作区负载 (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 检查我的可用路线非常有帮助,并让我更好地了解路线。
我发现一些有用的链接:
【问题讨论】:
标签: ruby-on-rails