Лучше использовать выбор или перебрать массив записей в Rails? - PullRequest
0 голосов
/ 02 июля 2019

Моя цель - написать приведенный ниже запрос самым чистым и эффективным способом и минимизировать попадание в БД.Заранее благодарны за любые указания.

Я нашел несколько записей, которые относятся к user, как показано ниже:

english_shows = @user.shows.where(language: 'english')

Допустим, shows относятся к разным categories (используя внешний ключ), поэтому он выглядит следующим образом:

<ActiveRecord::Relation [
  <Show id: 1, category_id: 1, title: 'Rick and Morty'>,
  <Show id: 2, category_id: 2, title: 'Black Mirror'>,
  <Show id: 3, category_id: 3, title: 'Stranger Things'>,
  <Show id: 4, category_id: 3, title: 'Game of Thrones'>,
  ...
]

Если я хочу получить заголовки shows для каждой категории, я знаю, что могу использовать select следующим образом. То же самое можно сделать с where, но это вызовет дополнительный вызов БД. ( [Редактировать] На самом деле, оба ударили бы по БД дважды).

# Using select
cartoons = english_shows.select { |show| show.category_id == Category.find_by(name: 'cartoon').id}.pluck(:title)

# Using where
cartoons = english_shows.where(category_id: Category.find_by(name: 'cartoon').id)pluck(:title)

Тем не менее, метод select по-прежнему приводит к нескольким строкам длинного кода (в моем реальном случае использования у меня есть больше типов категорий).Чище ли циклически просматривать записи, подобные этой (взятой из этого SO answer )?

cartoons, science_fiction, fantasy = [], [], []
@cartoon_id = Category.find_by(name: 'cartoon')
@science_fiction_id = Category.find_by(name: 'cartoon')
@fantasy_id = Category.find_by(name: 'cartoon')

english_shows.each do |show|
  cartoons << show if show.category_id == @cartoon_id
  science_fiction << show if show.category_id == @science_fiction_id
  fantasy << show if show.category_id == @fantasy_id
end

1 Ответ

2 голосов
/ 02 июля 2019

Попробуйте это:

english_shows
  .joins(:category)
  .select('shows.*, categories.name as category')
  .group_by(&:category)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...