Как найти связанные записи с тегами, используя SQL или Sphinx - PullRequest
0 голосов
/ 14 июня 2011

У меня есть приложение, в котором много историй

Каждая история имеет и относится ко многим тегам (с использованием актов-тег-на-тегов)

Каждая история также индексируется мышлением сфинкса

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

С учетом следующих данных:

Story #1 tagged with a,b,c,d
Story #2 tagged with a
Story #3 tagged with b,a
Story #4 tagged with d,c,b

Story.find(1).related #=> Story 4, Story 3, Story 2


... в таком порядке

Кто-нибудь может предложить хороший подход для этого? Я предполагаю, что есть простой способ сделать это, используя SQL, но я не супермен SQL

Спасибо

Бо

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Это должно сделать это.Story.find(1).find_related_tags

0 голосов
/ 24 июня 2011

Вот что я в итоге сделал, чтобы решить эту проблему:

class MyModel < ActiveRecord::Base

  scope :related_to, lambda { |record|
    joins(:tags,:taggings).
    where(record.class.model_name == self.model_name ? ["#{table_name}.id != ?", record.id] : "").
    where("tags.id IN (SELECT taggings.tag_id from taggings where taggable_type = ? and taggable_id = ?)", record.class.model_name, record.id).
    order("count(DISTINCT(tags.id)) DESC").
    group("#{table_name}.id")
  }

end

Что означает, что я могу:

  @blog_post.related_to(@ad) # => returns all @blog_posts with the same tags as @ad, in order of the number of tags they share!
0 голосов
/ 16 июня 2011

Не знаю точно, как выглядит ваша БД, но я предполагаю, что она выглядит так:

stories:
  id
  content

tags:
  id
  name

story_tags:
  story_id
  tag_id

Попробуйте сначала выполнить запрос, чтобы посмотреть, дает ли он ожидаемые результаты:

SELECT stories.id, COUNT(*) AS ordering FROM stories 
  INNER JOIN story_tags ON story_tags.story_id = stories.id 
  WHERE story_tags.tag_id IN ('id of tag a', 'id of tag b', 'id of tag c', 'id of tag d') 
  GROUP BY stories.id
  ORDER BY ordering DESC;
...