Каков наилучший способ получить два запроса индекса от одной модели в RoR? - PullRequest
1 голос
/ 27 апреля 2020

У меня есть модель 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

1 Ответ

1 голос
/ 27 апреля 2020

Ваш путь к определению top_rated неверен.

Измените ваш route.rb, чтобы показать:

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

Используйте команду rake routes, чтобы показать вам, как правильно построить ваши маршруты. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...