Как вы делаете это в MySQL или рельсы - PullRequest
0 голосов
/ 03 ноября 2011

Скажем, у вас есть таблица записей и таблица тегов, и оба связаны таблицей post_tags.

так

сообщения имеют столбцы идентификатора / темы / тела

теги имеют идентификатор / имя

post_tags имеет идентификатор / post_id / tag_id

в терминологии rails, у меня есть Post Model, в которой много тегов через AssetTags.

Я пытаюсь запросить пост с двумя конкретными тегами. поэтому, если есть тег rails и тег mysql, я хочу запрос, который возвращает сообщение, содержащее только эти два тега.

имеет смысл?

Есть ли способ сделать это с помощью activerecord (я использую логику поиска) или mysql?

Ответы [ 4 ]

1 голос
/ 03 ноября 2011

Этот 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'
;

Что касается выполнения через активную запись, альтернативой может быть запрос каждого из тегов, а затем и полученных массивов для пересечения двух.

0 голосов
/ 03 ноября 2011

Ответ Джона Бачира можно изменить на ...

Post.joins(:asset_tags => :tag)
    .where("tags.name in ('?')", 'foo')
    .where("tags.name in ('?')", 'bar')
0 голосов
/ 03 ноября 2011

Учитывая эти модели:

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-интерфейс, который использует это.

0 голосов
/ 03 ноября 2011

Для 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();
...