首页 > 解决方案 > 控制数组样本的内容

问题描述

我有一个集合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 %>

标签: ruby-on-railsruby

解决方案


如果您想做复杂的结果,有时最好不要在一个查询中完成所有操作。它可能比简单的逻辑更难维护。但是,在可维护性、可扩展性和性能之间肯定存在平衡。

我建议做这样的事情:

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'])

这是未经测试的代码。这只是为了让您了解如何实现目标。


推荐阅读