【问题标题】:What is the best way to GET two index requests from the same model in RoR?从 RoR 中的同一模型获取两个索引请求的最佳方法是什么?
【发布时间】: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' =&gt; '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


    【解决方案1】:

    您的 top_rated 定义路径错误。

    更改您的 routes.rb 以显示:

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

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

    【讨论】:

    • 感谢您的回答。我调整了我的 routes.rb 以匹配您的答案,但我仍然收到相同的消息。我在代码中将路线向上移动了几行,现在它可以工作了。我将在我的问题中发布更新的代码。
    • 当然!!再次感谢。 rake routes 兔子洞对下去非常有用。我学到了很多东西,主要是我还有很多东西要学!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多