Rails :.each do EXCEPT

时间:2013-12-04 00:47:39

标签: ruby-on-rails

我在我的应用中有这段代码

<% foos.each |f| %>

   <% f.user.foos.each |f| %>
     // How do you show all the foos except the foo above?
   <% end %>

<% end %>

除了上面的“foo”外,你如何展示所有的foos?


我不是要删除第一个元素。我正试图删除那个“foo”

3 个答案:

答案 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 %>

Ruby Enumerable docs