添加N个标签对象的大量使用acts_as_taggable_on(Add N tags to a L

2019-09-29 05:12发布

我使用一个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标签(县)的集合呢!

Answer 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


Answer 2:

通过萨维里奥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库的补丁,希望这可以帮助!

谢谢您的帮助!



文章来源: Add N tags to a LOT of objects using acts_as_taggable_on