シナリオ:
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 のみのソリューションを探しています。結果を別のテーブルにキャッシュする必要はありません。