0

基本的にタグ付きのブログとして機能する Rails 3.2 アプリに取り組んでいます。

タグは has_many :through 関連付けの投稿に関連付けられています。(投稿にはtaggignsを介して多くのタグがあります)同じように機能するため、アプリにhabtm関連付けがない理由はわかりませんが、それは私が持っているものです.

アプリは、次のようなタグに属する投稿のリストを表示できるようになりました:

class TagsController < ApplicationController

  def show
    @tag = Tag.find(params[:id])    
    @posts = @tag.posts.paginate(page: params[:page], :per_page => 10) 
  end
  ...
end

このように、ページ example.com/tags/1 には、ID 1 に一致するタグを持つすべての投稿が表示されます。

私がしなければならないことは、タグのチェックボックスを持ち、たとえばタグ 1 と 4 の両方を持つ投稿に検索を制限するようにこのアプリを変更することです。

どこから始めるべきか、または探すべきリソースについて、誰かが私に情報を提供してもらえますか? 結合を使用する必要があると思いますが、そうであるかどうかはわかりません。

ありがとうございました。

========

編集:回答ありがとうございます。とにかく、ok32 で示唆されているように、user1083138 のソリューションは重複を作成していました。同時に、ok32 のものは空の配列になりました (おそらく、タグ付けシステムの実装が不十分なためです)。

私はうまく機能するこのソリューションを考え出しました:

  def self.tag_query(list)
    Post.joins(:tags).where(:tags => { :name => list } ).having("count(tags.name) = ?", list.count ).group('posts.id')
  end
4

2 に答える 2

0

JOIN はあなたの友達ですが..結果の重複を避けるために、次のようなものを使用することをお勧めします。

コントローラーで:

@tags = Tag.find(params[:tag_ids])
@posts = Post.tagged_with(@tags)

Postモデルでは:

def self.tagged_with(tags)
  post_ids = select('posts.id').joins(:tags).where('tags.id in (?)', tags)
  where(id: post_ids)
end

アップデート:

モデル メソッドを少し変更しました。

def self.tagged_with(tags)
  post_ids = joins(:taggings).where('taggings.tag_id in (?)', tags)
  where(id: post_ids)
end

変化したこと:

  1. 不要なものを取り除きましたselect('posts.id')。それがなくてもうまく機能します。

  2. より効率的なクエリが生成されるようになりました (2 つではなく 1 つのテーブルに結合されます)。

于 2012-09-09T21:58:11.910 に答える
0

はい、JOIN はあなたの友達です:

Post.joins(:tags).where(:tags => { :id => [tag_ids] } )

こちらのレールガイドを参考にしてください。

また、チェックボックスを表示し、「tag_ids」変数を設定するには、ビューとコントローラーを作成/変更する必要があります。

于 2012-09-09T21:16:03.223 に答える