使用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_tags和remove_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 ,希望这可以帮助你!
谢谢您的帮助!