繁体   English   中英

从 RoR 中的同一个 model 获取两个索引请求的最佳方法是什么?

[英]What is the best way to GET two index requests from the same model in RoR?

我有一个有很多评论的 WorkSpace model。 在评论 model 中,我有一个使用整数进行编号评级的评级列。

我想列出 WorkSpace model 中的所有work_spaces ,并根据模型的整体评价列出前 5 个work_spaces

在我的 controller 中,我有一个索引方法,可以很好地检索所有工作空间。

工作区控制器
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

通过将我的逻辑放在我的 work_space model 中,我成功地检索了评分最高的 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 Controller 中对该信息运行 GET 请求就足够简单了,因此我尝试将此方法添加到 controller。

工作区控制器
 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

这回应:

开始 GET "/work_spaces/top_rated" for::1 at 2020-04-26 23:35:38 -0400 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 和 ZFAE8A9257E154175DAZ4193 0.06ms) 完成 404 Not Found in 16ms (Views: 2.6ms | ActiveRecord: 3.1ms)

在我看来,参数正在寻找用于显示工作空间的 ID。

我用 top_rated 方法替换了我原来的索引方法并且效果很好,但我似乎无法让两个索引同时工作。

我应该将逻辑留在 model 中吗? 我想知道这种逻辑的最佳实践是什么。 提前感谢您能给我的任何帮助或指导。

更新

感谢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

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

更改您的 routes.rb 以显示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM