2011-02-18 6 views
2

사용자 모델이 있습니다. 각 사용자에게는 레스토랑 이름이 있습니다. 모든 사용자를 보여주는 뷰 (index.html.erb)가 있습니다.Ruby : 일치하는 두 배열을 비교하고 DESC 순서로 결과를 정렬하십시오.

나는 (그것을 반대한다!) ... CURRENT_USER 및 다른 사용자가 내림차순으로 공통점이 얼마나 많은 레스토랑에 따라이보기에서 사용자를 주문


예를 원한다.

사용자 1 (CURRENT_USER)는 맥도날드, 버거 킹,로했다 Arby의

사용자 2는 바르의이

은 사용자 3 맥도날드, 버거 킹에왔다


은 사용자 1 인덱스를로드 할 때에있다 보기에서 사용자가 표시되어야하는 순서는 다음과 같습니다.

사용자 1 (3/3 레스토랑 검색)

사용자 3 (2/3 레스토랑 일치)

사용자 2 (0/3 레스토랑 일치)


내 User.rb 파일

def compare_restaurants 
    self.restaurants.collect 
end 

내 users_controller.rb

def index 
    @users = User.all.sort_by {|el| (el.compare_resturants & current_user.compare_resturants).length } 
end 

답변

4

당신은 그냥 숫자를 부정 할 수 sort_by 사용에 죽은 세트 인 경우 : 당신이 숫자 값으로 정렬하고 있기 때문에이 트릭에만 작동

def index 
    @users = User.all.sort_by { |el| 
    -(el.compare_resturants & current_user.compare_resturants).length 
    } 
end 

.

reverse_sorted = a.sort_by { |x| something(x) }.reverse 

을하지만 배열과 reverse 할 것이다 추가 작업의 추가 사본을 포함합니다 : 당신이 문자열을 정렬 된 경우이 같은 것을 사용해야 할 것입니다. 이 경우 반전 된 비교 논리가있는 sort을 사용해야합니다. 각 비교 비싼 뭔가를 계산 피하기 위해 sort_by하고있었습니다있어 그리고 당신은 숫자가 아닌 뭔가에 정렬 된 경우

, 당신은 항상 한 번만 비싼 물건을 계산하기 위해 명시 적 Schwartzian Transformsort을 사용할 수 있습니다.

0

컨트롤러에서 정렬 만하면됩니다.

my = User.find_by_id this_user # Or however you're getting "the current user" 
@users = User.all.-([my]).sort do |a, b| 
    common_with_a = (my.restaurants & a.restaurants).length 
    common_with_b = (my.restaurants & b.restaurants).length 
    common_with_a <=> common_with_b 
end 

은 ... 당신은 사용자가 다양한 열을 정렬하거나 정렬 많이 반전 시작시키는 계획하고 있다면, 당신은 자바 스크립트에서 종류를 구현해야하지만, 그래서 당신은 페이지를 다시로드의 수를 줄일 수 있으며, 당신이 만들어야하는 후속 데이터베이스 히트.

+0

@echoback 귀하의 답변을 주셔서 감사합니다. 그러나 "배열로 변환 할 수 없습니다 .." – thedeepfield

+0

나는 작동하도록했습니다.하지만 내림차순으로 필요합니다! ive 내 코드를 업데이트 .. – thedeepfield

+0

마지막 줄을'common_with_b <=> common_with_a'로 바꾸어 순서를 바꾸십시오. – zetetic

관련 문제