2012-09-28 52 views
1

我使用一個Rails(紅寶石1.9.3)項目acts_as_taggable_on寶石的對象很多。 我向我的管理員提供一個表單,將1..n標記添加到資源列表(讓我們說客戶端)。添加N個標籤使用acts_as_taggable_on

我沒有找到辦法做到這一點散裝。 現在我正在循環每個客戶端並添加一個標籤,然後保存該對象。 當我嘗試使用X千客戶端時,這會傷害服務器,最終導致超時。

我在想,如果有一個標籤應用到一個ActiveRecord集合或東西的方式。如果記錄在案,我深​​表歉意,但我無法找到任何人在任何地方做這件事。

我可以看到如何通過全部由自己做一個自定義的SQL查詢來破解它,但我更喜歡以避免黑客攻擊寶石這樣,OFC。

現在我做這樣的事情

像這樣的事情

# Client.selection returns a clients collection 
Client.selection.each do |client| 
    tags_to_add.each{|a| client.tag_list << a} 
    tags_to_remove.each{|a| client.tag_list.remove(a)} 
    client.save 
end 

非常感謝您的時間。

外:好,我需要能夠去除1..1標籤(縣)的集合呢!

+0

是否有任何特定的訂購需要使用?你可以顯示你現在使用的ruby代碼是否需要針對批量插入進行優化? – PinnyM

+0

您的數據庫是否支持批量插入?也就是說,它是否會採取如下命令:'INSERT INTO foo(field1,field2)VALUES(1,1),(2,2),(3,3)'。這種類型的插入在一次傳遞中添加所有行,但並非所有的DBMS都支持它。 – PinnyM

回答

1

通過薩維里奧answser啓發,我終於擴展的ActiveRecord ::有關係add_tagsremove_tags方法。

下面是一個例子:

# Our ActiveRecord::Relation 
clients = Client.where('created_at > ?', Time.now - 2.months) 
# Our tags 
tags_to_add = ['here','a','bunch','of','tags'] 
tags_to_remove = ['useless','now'] 
# Adding and removing tags 
# (You can specify the tagging context as a second parameter) 
clients.add_tags(tags_to_add).remove_tags(tags_to_add, 'jobs') 

我創建了補丁Github repo,希望這可以幫助!

感謝您的幫助!

2

直接使用標記模型。像下面的內容可以使用(假設加標籤的對象是同一類的)

Tagging.transaction do 
    client_ids.each do |cid| 
    tag_ids.each do |tid| 
     values = ["Client".inspect, cid, tid].join(", ") 
     Tagging.connection.execute "INSERT INTO taggings (taggable_type, taggable_id, tag_id) VALUES (#{values}) ON DUPLICATE KEY UPDATE id=id" 
    end 
    end 
end 

缺失要簡單得多

Taggings.where(:taggable_type => "Client", :taggable_id => client_ids, :tag_id => tag_ids).delete_all 
相關問題