5

シナリオ:

https://www.funtraker.comには、映画、テレビ番組、ゲームが掲載されています。各リソース (映画、テレビ番組など) の番組ページで、関連するリソースを一覧表示します。

スキーマ:

class Movie < AR::Base
  has_many :resource_genres, as: :resource
  has_many :genres, through: :resource_genres
end

class ResourceGenre
  belongs_to :resource, polymorphic: true
end

ここで、一致したジャンルに基づいて関連する映画のリストを取得したいと考えています (両方の映画が「コメディ」ジャンルの場合、2 つの映画は関連しています)。また、これらの関連映画は、一致するジャンルの最大数で並べ替える必要があります。

さて、ここにサンプルムービーと期待される出力があります。

#Input
Movie         Genres
Movie 1:      horror, comedy, action, war
Movie 2:      action, thriller, crime, animation  
Movie 3:      comedy, war, action, thriller
Movie 4:      crime, animation, action, war

#Expected output
movie1.related_movies => [ movie3, movie2  ]
movie4.related_movies => [ movie2, remaining-three-movies-in-any-order ]
movie3.related_movies => [ movie1, movie2, movie4] 

うまくいけば、質問は理にかなっています。

更新: SQL のみのソリューションを探しています。結果を別のテーブルにキャッシュする必要はありません。

4

2 に答える 2

0

Rails コードで解決策を見つけている場合は、問題が解決する可能性があります。

def related_movies
  scores_hash = {}
  Movie.joins(:resource_genres).where('resource_genres.genre_id' => resource_genres.pluck(&:genre_id)).where.not(id: self.id).distinct.find_each do |movie|
    scores_hash[movie] = (movie.resource_genres.pluck(:genre_id) & self.resource_genres.pluck(:genre_id)).count
  end
  Hash[scores_hash.sort_by { |movie, score| -score }].keys
end
于 2015-01-21T08:43:12.080 に答える