我在 :users 和 :books 之间有 has_and_belongs_to_many 关系。它们由 :owned_books 模型加入。我的应用程序的一项功能是连接阅读过相同书籍的用户。目前,我在模型中的处理效率低下:
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 语句是否会起作用,尽管一旦我有一个可靠的 join 语句,我可能会弄清楚这一点。