2011-05-01 97 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

相關問題