:users と :books の間に has_and_belongs_to_many 関係があります。それらは :owned_books モデルによって結合されています。私のアプリの機能の 1 つは、同じ本を読んだユーザーを接続することです。現時点では、モデルでこれを非効率的に処理しています。
users_hash = Hash.new
users = User.all
users.each do |user|
if user != current_user
users_hash[user.id] = 0
user.books.each do |book|
if current_user.books.include?(book)
users_hash[user.id]+=1
end
end
end
end
users_hash = users_hash.sort {|a,b| b[1]<=>a[1]}
@users = Array.new
users_hash[0..max].each do |id|
user = User.find(id[0])
@users << user
end
end
データベースにこの作業をさせる方法があると思います。私は、次のような MySQL クエリをいじっています。
@users = User.select("users.*, COUNT(books) AS shared_books").joins("LEFT JOIN books ON ???").order("shared_books DESC").limit(100)
私の意図は、 current_user が読んだ本に参加し、他のすべてのユーザーの数を取得して、それらの本を何冊読んだかを確認することです。次に、このカウントで結果を並べ替え、上位 100 件の結果に制限します。
残念ながら、私の MySQL のスキルは十分ではありません。特に結合モデルの条件の書き方がよくわかりません。また、select ステートメントが機能するかどうかも疑問ですが、確かな joins ステートメントがあれば、おそらくそれを理解できるでしょう。