我的portfolio_controller.rb
具有这样的索引方法:
def index
@portfolio = PortfolioItem.all
end
在该块中的代码应执行6次的情况下,如何指定?换句话说,如何使用循环从视图中的@portfolio
对象中访问6个值?这是我到目前为止的内容:
<% @portfolio.shuffle.each do |portfo| %>
答案 0 :(得分:3)
使用all
,然后使用shuffle
是一个不好的解决方案,有两个原因。
稍作改进的是使用sample(6)
而不是shuffle.first(6)
,因为这从流程中删除了一步。
但是,这里更大的问题是Portfolio.all.<something>
(其中<something>
方法需要将数据转换为红宝石Array
)将获取全部的全部数据存入内存-这是一个坏主意。随着表的增长,这将成为更大的性能问题。
一个更好的主意是在SQL中使用order
和limit
方法在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| %>