【问题标题】:Add N tags to a LOT of objects using acts_as_taggable_on使用acts_as_taggable_on 向大量对象添加N 个标签
【发布时间】:2012-09-20 12:17:33
【问题描述】:

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

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

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

我可以通过自己执行自定义 SQL 查询来了解如何破解它,但我更愿意避免像这样破解 gem。

现在我正在做这样的事情

类似的东西

# 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 个标签删除到集合中!

【问题讨论】:

  • 您需要使用任何特定的顺序吗?您能否展示您现在使用的哪些 ruby​​ 代码需要针对批量插入进行优化?
  • 您的数据库是否支持批量插入?也就是说,它是否需要这样的命令:INSERT INTO foo (field1, field2) VALUES (1, 1), (2, 2), (3, 3)。这种类型的插入一次添加所有行,但并非所有 DBMS 都支持。

标签: ruby-on-rails ruby bulk acts-as-taggable-on


【解决方案1】:

受 Saverio answser 的启发,我终于用 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,希望对你有帮助!

感谢您的帮助!

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多