我在:users和:books之间有一个has_and_belongs_to_many关系。他们加入了:owned_books模型。我的应用程序的一个功能是连接阅读相同书籍的用户。目前,我在我的模型中效率低下:Rails 3:为HABTM关系编写联接声明
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语句会起作用,尽管我可以在我有一个可靠的连接语句时解决这个问题。
作为说明,通常使用'{}'来代替'Hash.new','']'优先于'Array.new'。调用构造函数仅用于定制哈希或数组如何操作。 – tadman