ruby-on-rails - 一覧 - taggings




Railsでgemの 'acts-as-taggable-on'を使っている間にすべてのタグのリストを取得する方法(カウントではなく) (2)

ActsAsTaggableOn::Taggingモデルを使用すると、すべてのタグのリストを取得し、コンテキストに応じてそれらをフィルタリングし、次のようにフォーマットすることができます。

ActsAsTaggableOn::Tagging.all
.where(context: "deshanatags")
.map {|tagging| { "id" => "#{tagging.tag.id}", "name" => tagging.tag.name } }

指定されたコンテキストに対するすべてのタグ付けの結果をwhereに渡すかは、 mapを使用して反復し、結果の各タグ付けに関連するタグを取得し、id属性とname属性を取得します。

あなたがruby 1.9+を使用していない場合は、メソッドを直接(複数の行に渡ってではなく)連結してください。

その結果に対して.to_jsonを呼び出して、使用できる適切にフォーマットされたjsonオブジェクトを取得できます

編集:

私はポストを更新して、各ステートメントが何をするのかを明確にし、シンボルの代わりに文字列をキーとして使用する最終結果のフォーマットも更新しました

私はこのように、私のモデルでacts-as-taggable-on宝石を設定しました:

 acts_as_taggable_on :deshanatags

これはコンテキストdeshanatags使用します。 今、私はすべてのタグのリストを取得する必要があります(1つのアイテムに割り当てられたタグだけでなく、すべてが必要です)。このコンテキストでは、次の形式でタグを取得します。

[
    {"id":"856","name":"House"},
    {"id":"1035","name":"Desperate Housewives"}
]

これどうやってするの?

私は多くのチュートリアルに従いましたが、それらのほとんどはRails 3のために書かれているため、行き詰まりました.Rails for attr_accessorの削除などのモデルにいくつかの変更があり、それらのチュートリアルを理解することが難しくなります。 だから助けてください。

単に私のアプリにJquery Tokenの入力( http://loopj.com/jquery-tokeninput/ )を追加しようとしています

PS: Tagging Tableを使って、Tag.allの出力のようなタグのリストをコンテキストをフィルタリングして取得する方法はありますか?


タグはTagsテーブルに格納されています。

ActsAsTaggableOn::Tag.all

タグの使用に関する詳細情報が必要な場合は、テーブルもあります

ActsAsTaggableOn::Tagging

各タグが使用されている場所へのリンクが含まれています。

これをさらにあなたの例に適用するには、

ActsAsTaggableOn::Tagging.includes(:tag).where(context: 'deshanatags').map { |tagging| { 'id' => tagging.tag_id.to_s, 'name' => tagging.tag.name } }.uniq

このステートメントのさまざまな部分について説明しましょう。

  • 'includes'は、異なるタグが「熱心に読み込まれた」ことを確認します。つまり、n + 1レコードを読み込む代わりに、データベースで2回のクエリだけが実行されます
  • 'where'は、指定されたコンテキストを持つレコードにレコードを制限します。
  • 'map'は、結果の配列を新しい配列に変換します。新しい配列には、問題で尋ねたハッシュと、idをタグのidにマッピングし、nameをタグの名前にマップします
  • 最後に 'uniq'はあなたのリストにダブルスを入れないようにします

あなたの追加の問題にも対処するために、タグなしのタグがある場合は、where句を

where("(context = 'deshanatags') AND (tag_id IS NOT NULL)")




acts-as-taggable-on