我在我的应用中有这段代码
<% foos.each |f| %>
<% f.user.foos.each |f| %>
// How do you show all the foos except the foo above?
<% end %>
<% end %>
除了上面的“foo”外,你如何展示所有的foos?
我不是要删除第一个元素。我正试图删除那个“foo”
答案 0 :(得分:2)
foos.drop(0).each do |f|
f.do_something
end
代码删除此Array的第一个元素,然后迭代。
如果foos
不是数组而是ActiveRecord :: Relation对象(又称范围),请注意。此代码无效。在这种情况下,最好直接从查询中提供正确的集合。
更新注意到OP实际上需要在嵌套循环上进行修改。
第二个“每个”循环都有气味,foos
手太长,无法管理用户的内容。让我们重构并使用一个更好的例子。假设您需要列出所有文章,您需要列出作者的文章,除了当前文章。
class Article < ActiveRecord::Base
def author_other_articles
user.other_articles(self)
end
end
class User < ActiveRecord::Base
def other_articles(article)
self.articles.where.not(id: article.id)
end
end
# View
<%= @articles.each do |article| %>
<h2><%= article.title %></h2>
<%= article.authoer_other_articles do |a| %>
<h3><%= a.title %></h3>
<% end %>
<% end %>
答案 1 :(得分:0)
你的代码有点令人困惑,因为你在你的循环中使用相同的变量f
,但我想我知道你想要实现的目标
>> (1..5).each do |num1|
>> (1..5).each do |num2|
>> next if num2 == num1
>> print num2
>> end
>> puts ''
>> end
2345
1345
1245
1235
1234
基本上,如果foo与外部循环中的foo相等,那么你需要做的就是在第二个循环中添加一个检查。另外,为每个循环使用不同的变量。
答案 2 :(得分:0)
尝试使用select
:
<% foos.each |foo| %>
<% foo.user.foos.select{ |f| f != foo }.each |inner_foo| %>
// do stuff with inner_foo
<% end %>
<% end %>