사용자와 : books간에 has_and_belongs_to_many 관계가 있습니다. 그들은 다음과 같이 합류했습니다 : owned_books 모델. 내 응용 프로그램의 한 기능은 동일한 책을 읽은 사용자를 연결하는 것입니다. 지금이 순간, 나는 비효율적으로 내 모델이 처리 :레일 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의 쿼리를 놀겠다는 거 봤는데 : 내 의도는 그 책의 얼마나 많은을보기 위해 다른 모든 사용자를위한 수를 얻을 후 CURRENT_USER가 읽은 책에 가입하는 것입니다
@users = User.select("users.*, COUNT(books) AS shared_books").joins("LEFT JOIN books ON ???").order("shared_books DESC").limit(100)
그들은 읽었습니다. 그러면이 수를 기준으로 결과를 주문하고 상위 100 개의 결과로 제한합니다.
불행히도 내 MySQL 기술은 스너프가 아닙니다. 특히 조인 된 모델의 조건을 작성하는 방법을 잘 모르겠습니다. 또한 select 문이 제대로 작동하는지 의심 스럽지만 일단 솔리드 조인 문이 있으면 알아낼 수 있습니다.
주목할 것은 일반적으로'Hash.new' 대신'{}'이 사용되고'Array.new'보다'[]'가 더 선호됩니다. 생성자를 호출하는 것은 해시 또는 배열이 작동하는 방식을 사용자 정의하는 데 필요합니다. – tadman