循环通过对象改变每个循环的顺序

时间:2013-11-15 07:10:15

标签: ruby-on-rails

我有一个对象列表(作者),并希望循环遍历它们,将它们的一个属性(名称)打印为粗体,然后在每个循环后面跟随其余的名称,具有此输出:

名称A ,名称B,名称C

名称B ,名称A,名称C

名称C ,名称A,名称B

我以为我可以使用except执行此操作,但此代码:

titles.each do |t| 
  ...
  list_without_current_name = t.authors.except(t.author)
  ...
end

不会删除作者,但会向我提供其他人的完整列表

3 个答案:

答案 0 :(得分:3)

您可以使用Array#permutation这样的方法

authors = ['Mark Twain', 'George Orwell', 'Ernest Hemingway'] 
authors.permutation.each do |p|
  p.each_with_index {|author, i| i == 0 ? print_bold(author) : print_regular(author)}
end

答案 1 :(得分:1)

titles.each do |t| 
  t.authors.each do |author|
      first_name = author.name
      other_authors = t.authors.reject do |a|
          a == author
      end
      authors_sorted = other_authors.sort_by do |other_author|
          other_author.name
      end
  end
  #here you output first_name and then authors_sorted
end

答案 2 :(得分:0)

只需将a.author更改为a

authors.each do |a|
  print a
  authors.except(a).each do |b|
    print ", #{b}"
  end
  print "\n"
end