Добавьте N тегов к МНОЖЕСТВУ объектов, используя act_as_taggable_on
Я использую гем act_as_taggable_on в проекте Rails (Ruby 1.9.3). Я предоставляю форму своим администраторам, чтобы добавить теги 1..n к списку ресурсов (скажем, клиентов).
Я не нашел способа сделать это навалом. Прямо сейчас я зацикливаюсь на каждом клиенте и добавляю один тег, затем сохраняю объект. Это сильно вредит серверу, когда я пытаюсь подключить X тысяч клиентов, что в итоге приводит к тайм-ауту.
Мне было интересно, если есть способ применить тег к коллекции ActiveRecord или что-то. Если это задокументировано, мне очень жаль, но я не могу найти кого-нибудь, кто бы это делал.
Я могу понять, как взломать его, выполнив собственный SQL-запрос самостоятельно, но я предпочитаю избегать взлома этого драгоценного камня, офс.
Прямо сейчас я делаю что-то вроде этого
Что-то вроде этого
# 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 в коллекцию!
2 ответа
Вдохновленный ответчиком Saverio, я наконец расширил ActiveRecord::Relation с помощью методов 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 для патча, надеюсь, это поможет!
Спасибо за помощь!
Используйте непосредственно модель маркировки. Можно использовать что-то вроде следующего (предположим, объекты taggable принадлежат к одному и тому же классу)
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