如何从表格中选择6条随机记录

时间:2018-09-18 09:07:32

标签: ruby-on-rails ruby

我的portfolio_controller.rb具有这样的索引方法:

def index
  @portfolio = PortfolioItem.all
end

在该块中的代码应执行6次的情况下,如何指定?换句话说,如何使用循环从视图中的@portfolio对象中访问6个值?这是我到目前为止的内容:

<% @portfolio.shuffle.each do |portfo| %>

4 个答案:

答案 0 :(得分:3)

使用all,然后使用shuffle是一个不好的解决方案,有两个原因。

稍作改进的是使用sample(6)而不是shuffle.first(6),因为这从流程中删除了一步。

但是,这里更大的问题是Portfolio.all.<something>(其中<something>方法需要将数据转换为红宝石Array)将获取全部的全部数据存入内存-这是一个坏主意。随着表的增长,这将成为更大的性能问题。

一个更好的主意是在SQL中使用orderlimit方法在SQL 中执行“随机选择”,而不是在ruby中。这样避免了将其他数据提取到内存中的需求。

不幸的是,确切的解决方案是特定于数据库的。对于PostgreSQL和SQLite,请使用:

Portfolio.order('RANDOM()').limit(6).each do |portfolio|

或者对于MySQL,使用:

Portfolio.order('RAND()').limit(6).each do |portfolio|

您可以在Portfolio模型中将其定义为助手-例如:

class Portfolio < ApplicationRecord
  # ...

  scope :random_sample, ->(n) { order('RANDOM()').limit(n) }

  # ...
end

然后在您看来:

@portfolio.random_sample(6).each do |portfolio|

答案 1 :(得分:0)

您可以这样:

 <%(1..6).each do |i| %>
     <% #your statements %>
 <%end%>

答案 2 :(得分:0)

<% @portfolio.shuffle.each_with_index do |portfo, index| %>
  <%if index <= 6%>
    <p><%= portfo.title %></p>
  <%end%>
<% end %>

或者您可以这样做

<% @portfolio.shuffle.take(6).each do |portfo| %>
    <p><%= portfo.title %></p>
<% end %>

答案 3 :(得分:-2)

将其更改为

<% @portfolio.shuffle.first(6).each do |portfo| %>