Моя цель - написать приведенный ниже запрос самым чистым и эффективным способом и минимизировать попадание в БД.Заранее благодарны за любые указания.
Я нашел несколько записей, которые относятся к 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