2013-02-18 1 views
2

일을 단순하게하기 위해 특성에 열거 형을 사용하는 것을 피하고 대신 문자열 값을 저장하고 있습니다.미리 지정된 목록으로 레코드를 주문하는 가장 좋은 방법

나는 배열에 소정의 순서로 모든 가능한 값의 목록이 있습니다 MyTypeEnum.names

을 그리고 my_recs = MyModel.order(:my_type)

기록을 주문하는 가장 좋은 방법은 무엇입니까 레코드의 액티브 :: 관계 목록을 my_recs에서 : my_type 속성 값은 MyTypeEnum.names에있는 값의 배열에 의해 지정된 순서대로 나타 납니까?

my_recs = MyModel.order(:my_type) 
ordered_recs = [] 
MyTypeEnum.names.each do |my_type_ordered| 
    ordered_recs << my_recs.where(:my_type => my_type_ordered) 
end 

을하지만 배열을 구축하는 대신 액티브 :: 관계를 사용하여 성능을 살해하고 :

나는 이것을 시도 할 수? 더 깨끗한 방법이 있습니까? (참고 : 주문에 융통성을 부여하여 MyTypeEnum.names의 순서에 따라 위와 같이 하드 코드 된 것으로 가정하고 싶지 않을 수도 있음)

답변

1

별도의 쿼리를 수행하여 확실히 성과를 얻고 있습니다 MyTypeEnum의 모든 항목에 대해 이렇게하면 하나의 쿼리 만 필요합니다 (모든 레코드를 한 번에 가져 오는 것). MyTypeEnum:a, :b:c 포함

ordered_recs = Hash[MyTypeEnum.names.map { |v| [v, []] }] 

MyModel.order(:my_type).all.each do |rec| 
    ordered_recs[rec.my_type] << rec 
end 

ordered_recs = ordered_recs.values.flatten 

경우 ordered_recs는 그것의에 기초

irb(main):002:0> Hash[MyTypeEnum.names.map { |v| [v, []] }] 
=> {:a=>[], :b=>[], :c=>[]} 

레코드 적절한 Array에 첨부 된 상기 심볼들 각각에 의해 키잉 ArraysHash로 초기화 키를 Hash에 넣은 다음 모두가 적절히 그룹화되어 있으면 배열이 단일 레코드 목록으로 연결/병합됩니다.

관련 문제