2011-05-01 37 views
3

项目可以有多个标签。编辑项目时,我想列出输入字段中的所有标签(stackoverflow样式)。在Rails 3中,我有下面的代码,在调用join(' ')之前,我将所有的名字都推送到一个数组中,但有没有更快更优雅的方法?获取带空格分隔符的字符串列表的最有效方法

@tags = @project.tags 

@tags_array = [] 
@tags.each do |tag| 
    @tags_array << tag.name 
end 

@tags_string = @tags_array.join(' ') 

回答

6

也许你想什么Enumerable#collect方法:

@tags_string = @project.tags.collect(&:name).join(' ') 

收集就派上用场了,当你试图改变一个列表分成大小相同,这也正是在此模式的另一个列表。

&:name部分的含义是“给定对象上的调用方法名称”,它可以等效地拼写为{ |t| t.name }

Enumerable库真的很棒,你应该仔细看看它,并熟悉各种方法,因为它可以节省大量时间。

+0

这是超级好的。谢谢。 – 2011-05-01 19:29:21

+0

请注意,如果您发现'collect'作为此方法名称感到困惑,则它也可以作为'map'(除了少打字外,我发现它更清晰)。 – Phrogz 2011-05-01 20:05:26

+0

'map'是从Perl借来的,据我所知,并以各种其他语言显示出来,像'length'与'size'一样,它也做同样的事情。 – tadman 2011-05-02 16:16:29

0

一种方法是在遍历@tags数组时使用线程。看看这个优秀的文章http://rubysource.com/threading-ruby/

其次似乎@tag是一个数组 我会用地图返回名称数组,然后将它们加入到一个字符串

names = @tags.map{|tag| tag.name}.join(' ') 
+2

我不认为使用线程来收集列表是一个非常好的主意。如果你在谈论数以百万计的话,你只需要沿着这条路走下去,即使如此,取回时间也会大大超过提取名称所需的时间。 – tadman 2011-05-01 19:25:49

+0

我承认这可能是一种矫枉过正的做法,但假设有很多数组项目和对数组项目执行操作/处理。 – eastafri 2011-05-01 19:29:52

+1

你应该知道,通过数十万个物品的磨制和调用一个方法的时间几乎为零。除非你需要它,否则你永远不应该穿梭,因为沿着这条道路走下去会造成很多麻烦。 – tadman 2011-05-01 19:37:33

相关问题