问题描述
||
我有一个包含很多故事的应用程序
每个故事都有并且属于许多标签(使用行为作为标签)
每个故事也通过思考狮身人面像索引
我需要的是按标签查找彼此相关的故事,并按它们共享多少标签的顺序进行排序。
给定以下数据:
故事#1标记为a,b,c,d
故事#2标有
故事#3标记为b,a
故事#4带有d,c,b标签
Story.find(1).related#=>故事4,故事3,故事2
...以该顺序
有人可以为此建议一个好方法吗?我想有一种使用sql的简单方法,但我不是sql超人
谢谢
博
解决方法
这应该做。
Story.find(1).find_related_tags
, 不确定您的数据库到底是什么样子,但我假设它看起来像:
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;
, 这是我最终解决此问题的方法:
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,按它们共享标签的数量顺序!