使用acts_as_taggable_on将N个标签添加到大量对象中

我在Rails(Ruby 1.9.3)项目中使用acts_as_taggable_on gem。 我向管理员提供了一个表单,将1..n标签添加到资源列表中(假设客户端)。

我没有找到批量做到这一点的方法。 现在我循环每个客户端并添加一个标签然后保存对象。 当我尝试使用X千个客户端时,这对服务器造成很大伤害,最终导致超时。

我想知道是否有办法将标签应用于ActiveRecord集合或其他东西。 如果记录在案,我很抱歉,但我找不到有人在任何地方这样做。

我可以通过自己做一个自定义SQL查询来看到如何破解它,但我更喜欢避免像这样破坏gem,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..n标签到一个集合!

直接使用标记模型。 可以使用以下内容(假设可标记对象属于同一类)

 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 

受Saverio回答者的启发,我终于使用add_tagsremove_tags方法扩展了ActiveRecord :: Relation。

这是一个例子:

 # 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 ,希望这可以帮助你!

谢谢您的帮助!