Если вы хотите получить сложные результаты, иногда лучше не делать все это в одном запросе.Это может быть намного сложнее поддерживать, чем простая логика.Однако определенно существует баланс между удобством обслуживания, масштабируемостью и производительностью.
Я бы предложил сделать что-то вроде этого:
def top_books(limited_genres: [])
non_limited_books = Book.where.not(genre: limited_genres).order('units_sold DESC').first(10).sample(5)
limited_books = Book.where(genre: limited_genres).order('units_sold DESC').first(5).sample(1) # rename to limited_book if sample is kept to 1
(top_books + limited_books).sort_by(:units_sold)[0..5]
end
@top_selling_books = top_books(limited_genres: ['non-fiction'])
Это не проверенный код.Это просто чтобы дать вам представление о том, как достичь ваших целей.