前提・実現したいこと
Cloud9上でRuby on Railsを学ぶ目的で、音楽好きのためのSNSを作っています。
モデルは表(1)の2つです。
各ユーザーが複数のお気に入りを持っていて、
一つのお気に入りに一つずつの曲名と歌手名が保存されているという感じです。
モデル | 関係 | カラム |
---|---|---|
User | 1 | id, name, 他 |
Favorite | 多 | title, artist |
表(1)モデルとカラムと関係
ユーザー検索のためのフォームにBootstrapのTokenfieldを使用しています。
トークンの値と一致するartistかtitleを持つ、Userを検索して表示するという流れです。
トークンはAjaxを使ってparams[:search]に『 | 』で区切られた文字列として入ります。
以下のコードで、ここまでは実装することが出来ました。
def self.search(search) if search != '' patterns = search.split("|") #searchを配列に where_body = '' patterns.each do | pattern | fixed_pattern = pattern.gsub("'", "''") where_body += ' OR ' unless where_body.blank? where_body += "favorites.song LIKE '%#{fixed_pattern}%' OR favorites.artist LIKE '%#{fixed_pattern}%'" end User.includes(:favorites).where(where_body) else User.all end end
そして、表示する事が出来たので、次はこのUserの並べ替えをしようとしています。
並べ替えの規則を『トークンの値と 各Userが持つFavoriteのカラム(title, artist) とが一致する数の多い順』
というようにしたいのですが、どのように実装するのが良いのでしょうか?
初心者のうえ、抽象的な質問で申し訳ないのですが、よろしくお願いします。
環境
Cloud9 Ruby '2.0.0' Rails '4.0.5'
あなたの回答
tips
プレビュー