【问题标题】:How can I find related tagged records using SQL, or Sphinx如何使用 SQL 或 Sphinx 查找相关的标记记录
【发布时间】:2011-06-14 18:05:34
【问题描述】:

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

每个故事都有并属于许多标签(使用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 超人

谢谢

【问题讨论】:

    标签: mysql ruby-on-rails tags thinking-sphinx acts-as-taggable-on


    【解决方案1】:

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

    【讨论】:

    • 很好,我要去看看这个宝石。
    • Dhruva - 谢谢,您的回答基本上是正确的。我不得不稍微扩展一下我想做的事情,所以我在下面发布了我的解决方案
    【解决方案2】:

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

    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;
    

    【讨论】:

      【解决方案3】:

      这是我最终解决这个问题的方法:

      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,按照它们共享的标签数量排列!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 2016-02-19
        相关资源
        最近更新 更多