首页 > 解决方案 > 从 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来检查我的可用路线非常有帮助,并让我更好地了解路线。

我发现一些有用的链接:

https://guides.rubyonrails.org/routing.html

https://devhints.io/rails-routes

标签: ruby-on-rails

解决方案


您到 top_rated 定义的路径是错误的。

更改您的 routes.rb 以显示:

get 'work_spaces/top_rated', to: 'work_spaces#top_rated'

使用该命令rake routes向您展示如何正确构建您的路线。


推荐阅读