我收藏了books
。在我看来,我想从数据库中的前10本畅销书中随机抽取5本。但是,我只希望该示例中最多显示一个非小说类标题(book.genre
)。如果没有非小说类书籍不被采样,那就可以了。
控制器:
def index
@top_selling_books = Book.all.order('units_sold DESC').first(10).sample(5)
end
查看:
<% @top_selling_books.each.with_index(1) do |book, index| %>
<div>
<%= render "books/top_sellers", book: book, index: index %>
</div>
<% end %>
答案 0 :(得分:1)
如果要执行复杂的结果,有时最好不要在一个查询中全部完成。与简单的逻辑相比,维护起来要困难得多。但是,在可维护性,可伸缩性和性能方面绝对是一个平衡。
我建议做这样的事情:
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'])
这是未经测试的代码。只是给您一个有关如何实现目标的想法。