1

Rails (Ruby 1.9.3) プロジェクトでacts_as_tggable_on gemを使用しています。リソースのリスト (クライアントとしましょう) に 1..n タグを追加するためのフォームを管理者に提供します。

これを一括で行う方法が見つかりませんでした。現在、すべてのクライアントでループして、タグを 1 つ追加してオブジェクトを保存しています。これは、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 タグも削除できるようにする必要があります。

4

2 に答える 2

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
于 2012-09-28T15:52:57.733 に答える
2

Saverio answser に触発されて、私はついに 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 リポジトリを作成しました。これがお役に立てば幸いです。

助けてくれてありがとう!

于 2012-10-03T09:52:19.337 に答える