0

私は多くのストーリーを持つアプリケーションを持っています

各ストーリーには多くのタグがあり、所属しています (acts-as-taggable-on を使用)

各話も思考スフィンクスで索引付けされています

私が必要としているのは、タグによって互いに関連するストーリーを見つけ、それらが共有するタグの数の順に並べ替えることです。

次のデータがあるとします。

a,b,c,d でタグ付けされたストーリー #1
でタグ付けされたストーリー #2
b,a でタグ付けされたストーリー #3
d,c,b でタグ付けされたストーリー #4

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

あなたのDBがどのように見えるか正確にはわかりませんが、次のように見えると思います:

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 に答える