0

投稿テーブルとタグテーブルがあり、両方がpost_tagsテーブルによって関連付けられているとします。

それで

投稿にはid/subject/body列があります

タグにはID/名前があります

post_tagsにはid/post_id/tag_idがあります

Railsの用語では、AssetTagsを介して多くのタグを持つPostモデルがあります。

2つの特定のタグがある投稿をクエリしようとしています。したがって、railsタグとmysqlタグがある場合、これら2つのタグのみを持つ投稿を返すクエリが必要です。

わかる?

activerecord(私は検索ロジックを使用しています)またはmysqlでこれを行う方法はありますか?

4

4 に答える 4

2

このSQLは、両方のタグを含む投稿を返します。

select 
  p.* 
from 
  posts p
  ,asset_tags atg1
  ,asset_tags atg2
  ,tags t1
  ,tags t2
where
  p.id = atg1.post_id
and t1.id = atg1.tag_id
and t1.tag = 'MySQL' 
and p.id = atg2.post_id
and t2.id = atg2.tag_id
and t2.tag = 'Rails'
;

Active Recordを介してそれを行う場合、代替手段は、タグのそれぞれを照会し、次に結果の配列を照会して、2つの共通部分を取得することです。

于 2011-11-03T11:32:58.403 に答える
0

mysqlの場合、確かに、データを取得できます

 SELECT p.*
   FROM posts p 
   JOIN post_tags pt
     ON p.post_id = pt.post_id
  WHERE pt.tag_id in (tagId1, tagId2)

Rails ActiveRecordは使用していませんが、次のようなものになると思います。

 get('posts');
 join('post_tags','post_id');
 where_in('tag_id', array(tagId1, tagId2);
 execute();
于 2011-11-03T07:14:41.393 に答える
0

これらのモデルを考えると:

def Post
  has_many :asset_tags
  has_many :tags, :through => :asset_tags
end

def AssetTag
  has_one :post
  has_one :tag
end

def Tag
  has_many :asset_tags
  has_many :posts, :through => :asset_tags
end

あなたはこれを行うことができます:

Post.joins(:asset_tags => :tag).where(
  "tags.name in ('?', '?')", 'foo', 'bar' )

さて、これは実際にはアソシエーションとは何の関係もありませんhas_many :through-それを利用するさらに滑らかなAPIが提供されているかどうかはわかりません。

于 2011-11-03T07:25:33.063 に答える
0

JohnBachirの答えは次のように変更できます...

Post.joins(:asset_tags => :tag)
    .where("tags.name in ('?')", 'foo')
    .where("tags.name in ('?')", 'bar')
于 2011-11-03T11:39:02.627 に答える