2010-02-21 80 views
0

我的例子:Rails的ActiveRecord的更新領域

class Category < ActiveRecord::Base 
    has_many :tags, :as => :tagable, :dependent => :destroy 

    def tag_string 
    str = '' 
    tags.each_with_index do |t, i| 
     str+= i > 0 ? ', ' : '' 
     str+= t.tag 
    end 
    str 
    end 

    def tag_string=(str) 
    tags.delete_all 
    Tag.parse_string(str).each { |t| tags.build(:tag => t.strip) } 
    end 

end 

你會如何優化這一領域爲tag_string?我不想刪除所有標籤,每次我只想更新它們。有沒有更好的方式來解析帶標籤的字符串? 我不想使用插件!謝謝。

+0

爲什麼你不想使用插件?其他人已將此功能編碼並測試爲完美,因此您不必這樣做。問題中描述的標記關係效率低下,笨拙,並使標籤的最佳特徵標籤無法使用。 – EmFi 2010-02-21 19:33:39

回答

2

我知道你不想使用插件,但你可能想挖掘acts_as_taggable_on_steroids的來源,看看他們如何處理這些情況。根據我的經驗,使用該插件一直很無痛。

1
class Category < ActiveRecord::Base 
    has_many :tags, :as => :tagable, :dependent => :destroy 

    def tag_string 
    tags.map {|t| t.name }.join ', ' 
    end 

    def tag_string=(str) 
    tags = Tag.parse_string(str) 
    end 

end 

我不知道Tag.parse_string(str)方法做什麼。如果它返回一個Tag對象的數組,那麼比我的示例應該可以工作。我不確定這是隻會更新,還是刪除舊的並添加新的。您可以測試它並查看日誌的真實含義。

1

我同意其他評論者。你最好在這裏使用插件。這是一個解決方案。

class Category < ActiveRecord::Base 
    has_many :tags, :as => :tagable, :dependent => :destroy 

    def tag_string 
    tags.collect(&:name).join(", ") 
    end 

    def tag_string=(str) 
    # Next line will delete the old association and create 
    # new(based on the passed str). 
    # If the Category is new, then save it after the call. 
    tags = Tag.create(str.split(",").collect{ |name| {:name => name.strip} }) 
    end 

end 
+0

我不要做tag_string =(str)會做的伎倆。我錯了嗎? – xpepermint 2010-02-21 23:22:50

+0

我改變了答案。它應該工作。 – 2010-02-22 05:48:51