У меня есть модель WorkSpace, которая имеет множество отзывов. В модели отзывов у меня есть столбец рейтинга, использующий целые числа для пронумерованного рейтинга.
Я хотел бы перечислить все work_spaces
из модели WorkSpace, а также перечислить лучшие 5 work_spaces
на основе общего обзор рейтинга моделей.
В моем контроллере у меня есть метод индекса, который хорошо работает для извлечения всех рабочих пространств.
WorkSpacesController
# GET /work_spaces
def index
@work_spaces = WorkSpace.all
render json: @work_spaces
end
Мне удалось получить рабочие места с самым высоким рейтингом, разместив мои логи c в моей модели work_space.
WorkSpace
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
Я отправляю эту информацию через мой сериализатор, и она легко доступна, но она прикрепляется к каждому индексируемому рабочему пространству. Мне не нужно прикреплять информацию к каждому рабочему пространству. В конечном итоге мне нужно было бы получить эту информацию только при первоначальной загрузке приложения.
Я подумал, что достаточно просто выполнить запрос GET для этой информации в контроллере WorkSpaces, поэтому я попытался добавить этот метод в контроллер.
WorkSpacesController
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
Это ответило:
Started GET "/ work_spaces / top_rated" for :: 1 в 2020-04-26 23:35:38 -0400 Обработка WorkSpacesController # показать как / Параметры: {"id" => "top_rated"} Пользовательская нагрузка (0,4 мс) SELECT " users ". * FROM" users "WHERE" users "." token "= $ 1 LIMIT $ 2 [[" token "," 3bbddce2b4c8f7e6a79a62f56ad9229a "], [" LIMIT ", 1]] WorkSpace Load (0,4ms) ВЫБРАТЬ" work_spaces ". * FROM "work_spaces" ГДЕ "work_spaces". "Id" = $ 1 LIMIT $ 2 [["id", 0], ["LIMIT", 1]] [active_model_serializers] Рендеринг ActiveModel :: Serializer :: Null с Ha sh (0,06 мс) Выполнено 404, не найдено за 16 мс (Просмотры: 2,6 мс | ActiveRecord: 3,1 мс)
Мне кажется, что параметры ищут идентификатор для отображения рабочего пространства.
Я заменил свой оригинальный метод индекса на метод top_rated, и он работал хорошо, но я не могу заставить оба индекса работать одновременно.
Шоу Я просто оставлю логи c в модели? Мне интересно, что лучше всего подходит для этого типа логики c. Заранее благодарю за любую помощь или руководство, которое вы можете дать мне.
Обновление
Я получил это на работу благодаря NemyaNation .
Я изменил свой маршрут в route.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