2013-11-15 91 views
0

我有一个对象列表(作者),并希望通过它们循环打印它们的一个属性(名称)的粗体和第一个地方,其次是每个循环的其余名称这样的输出:循环通过对象改变顺序每个循环

名称的,名称B,名称C

名乙,名称A,名称C

名称C,名称A,名称乙

我想我可以用except做到这一点,但是这个代码:

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

不会删除作者,但给了我别人

的完整列表
+0

是否要在作者打印后删除作者? – joseramonc

+0

不,它应该每次都可见 – blissini

+0

每个循环都应该按照随机顺序输出粗体的第一作者和该循环的其他作者? – joseramonc

回答

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 
+0

+1,不知道'排列' –

0

只要改变a.authora

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

对不起,我编辑了这个问题。这是一个相关的模型,当我“简化”时出了点问题 – blissini

+0

不用担心,突触的答案应该适合你。 –

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