0

我有一个有很多故事的应用程序

每个故事都有并属于许多标签(使用acts-as-taggable-on)

每个故事还被思考狮身人面像索引

我需要的是通过标签找到彼此相关的故事,并按照它们共享的标签数量排序。

给定以下数据:

故事 #1 标记为 a,b,c,d
故事 #2 标记为
故事 #3 标记为 b,a
故事 #4 标记为 d,c,b

Story.find(1).related #=> 故事 4、故事 3、故事 2


...以该顺序

有人可以为此提出一个好的方法吗?我想有一种使用 SQL 的简单方法可以做到这一点,但我不是 SQL 超人

谢谢

4

3 回答 3

1

这应该这样做。Story.find(1).find_related_tags

于 2011-06-16T01:53:45.977 回答
0

不确定您的数据库到底是什么样子,但我假设它看起来像:

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;
于 2011-06-15T22:05:43.260 回答
0

这是我最终为解决这个问题所做的:

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) # => 返回所有具有与@ad 相同标签的@blog_posts,按照它们共享的标签数量排序!
于 2011-06-24T08:28:14.333 回答