ruby-on-rails - 控制数组样本的内容
问题描述
我有一个集合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 %>
解决方案
如果您想做复杂的结果,有时最好不要在一个查询中完成所有操作。它可能比简单的逻辑更难维护。但是,在可维护性、可扩展性和性能之间肯定存在平衡。
我建议做这样的事情:
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'])
这是未经测试的代码。这只是为了让您了解如何实现目标。
推荐阅读
- python - 如何获取在 InMemoryUploadedFile django 中上传的文件
- terraform - 您如何访问地图列表中的值?
- parsing - ReadP 在返回空结果之间
- javascript - Joi,根据数组长度验证不同的数组模式
- javascript - puppeteer 中的页面选择器奇怪行为
- html - 使用 CSS 将动画文本放在背景中?
- function - 如何从单个操作中获得多个输出?
- angular - 如何在下载前预览服务器上的文件?出现错误:不允许加载本地资源:blob
- c++ - C++编译时检查模板类型中是否存在方法
- string - 如何替换批处理文件中字符串中每次出现的=