我使用一个Rails(红宝石1.9.3)项目acts_as_taggable_on宝石。 我提供了一个形式到我的管理员,以1..1标签(一个或多个)添加到资源列表(比方说客户端)。
我didin't找到一种方法在散装做到这一点。 现在,我循环每个客户端上,并添加一个标签,然后保存对象。 这是伤害服务器了很多,当我试图在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标签(县)的集合呢!
直接使用的代码模型。 像下面的内容可以使用(假设加标签的对象是同一类的)
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
通过萨维里奥answser启发,我终于扩展的ActiveRecord ::关系与add_tags和remove_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库的补丁,希望这可以帮助!
谢谢您的帮助!