2009-11-30 4 views
0

나는이 같은 방법을 정의하여 액티브 모델에 사용자 지정 정렬을 추가했습니다 :기본 논리 정렬이

class MyClass < ActiveRecord::Base 
    belongs_to :parent_model #this would be the many in a has_many relationship 

    def <=>(other) 
    self.att <=> other.att 
    end 
end 

이 말을 충분을 실제로 비교에 사용되는 논리입니다 이 예제보다 조금 더 복잡하고 SQL을 사용하여 수행 할 수있는 작업이 아닙니다.

이 클래스는 포괄 모델의 중첩 필드로만 사용되므로 결과 세트를 정렬 할 수있는 간단한 공간이없는 것처럼 보입니다. 컨트롤러에서 : my_class는 eager loading을위한 include의 일부이지만 뷰 (form.fields_for : my_class)를 수행 할 때까지는 객체 배열을 가지고 다른 작업을 수행하지 않습니다. 필자가 정말로 원하는 것은 논리적 정렬을 사용하여 default_scope에 해당하는 작업을 수행 할 수있게하는 것이지만 가능하다고는 생각하지 않습니다. 지금 당장 내 유일한 옵션은이 결과에 정렬을하기 위해 컨트롤러에 여분의 줄을 추가하는 것 같지만 그렇게하는 것이 옳은 것처럼 보이지 않습니다.

내가 여기에 뭔가 더 우아한가요?

답변

0

이 작업을 수행하는 가장 좋은 방법은 SQL 정렬을 위해 데이터베이스를 설정하고 범위/찾기에서 : order 옵션을 지정하는 것입니다. 컨트롤러에서 정렬 작업을 수행하면로드 된 객체 수가 특정 임계 값을 초과하면 매우 많은 비용이 발생합니다. 특히 나열된 레코드 수를 제한하려고 시도하는 경우.

정렬이 실제로이 열을 정렬하는 것보다 복잡하다면. 정렬 키 열을 데이터베이스에 추가하는 것을 고려해야합니다. 물건을 주문하는 몇 가지 방법을 분명히 알아 냈습니다. 보통 물건의 상태에서 파생 된 두 값을 비교하는 것과 관련이 있습니다. 그 값을 before_create/save 콜백과 함께 새로운 sort_key 열의 데이터베이스에 저장하고 그 결과를 순서대로 정렬하십시오.

작업 예 :

우선 순위에 따라 순서가 있지만, 마감일은 금요일입니다 기록, 다른 모든 전에 나열되어 있습니다. 나는이 일을한다면 테스트 할 수 없었다

class Task < ActiveRecord::Base 
    def calculate_sort_key 
    key = due_date.wday == 5 ? "0" : "1" 
    key += prioirty.to_s 
    self.sort_key = key.to_i 
    end 

    before_save :calculate_sort_key 
    default_scope :order => "sort_key" 
end 
0

sort_key 열을 사용하지만이 같은 익명의 연결 모듈을 시도 할 수 :

class ParentModel < ActiveRecord::Base 
    has_many :my_class do 
    # Sort the result set... 
    end 
end 
+0

이 방법이 훨씬 쉽고 DRY 것 컨트롤러에서 정렬하는 것보다 그러나 그것은 컨트롤러에서 정렬의 동일한 문제가 있습니다. 즉, 큰 세트의 계산 시간/메모리 사용량 및 합병증 w.r.t. 선택된 행의 수를 제한합니다. 그런 다음 다시 특정 관계에서 문제가되지는 않습니다. – EmFi

+0

나는 여러 가지 변형을 시도했는데, 특정 상황의 상황을 고려할 때 내가 찾고있는 것이 더 많다. 그러나 기본적으로 블록을 실행하는 방법의 도약을 할 수는 없습니다. 나는 익명의 협회와 함께 일한 적이 없다. 실제로 이해하기에 충분하다 - 명백한 것 이상 - 어떻게 작동하는지, 나는 생각한다. 그래도 제안에 감사드립니다. – tmo256