2011-11-23 4 views
1

이것은 간단한 문제 여야하지만 좋은 해결책을 찾을 수없는 것 같습니다. 나는 사용자가 선택하고있는 ID의 목록을 가지고 있으며 그 목록에 대한 순서를 유지하려고한다.선택 순서로 정렬

foo_ids = [1899, 7, 1, 2, 3, 42] 

foos = Foo.find(foo_ids) 

선택시 주문을 보존하거나 결과 세트 후에 리조트를 반환하는 방법에 대한 아이디어가 있습니까?

답변

1

ActiveRecord로는 그렇게 할 방법이 없다고 생각합니다.

그러나, 여기에 내가 무엇을 할 것이라고이다 : 어떤 경우에, 기본 범위는 당신이 원하는 일이 아니기 때문에

people_ids = [1899, 7, 2, 3, 42] 

people = Person.unscoped.find(people_ids) 

people_ids.each_with_object(result = []) do |id, result| 
    result << people.detect { person.id == id } 
end 

result # => what you are looking for 

내가 Person.unscoped를 사용합니다. 그래서 조금 더 빨라질 수도 있습니다.

find (people_ids)를 사용하면 people_ids의 크기에 상관없이 하나의 쿼리 만 생성됩니다. 최악은 다음과 같이 뭔가를하는 것입니다 :

people_ids.each_with_object(result = []) do |id, result| 
    result << Person.find(id) 
end 

는 모든 ID에 대한 쿼리를 생성하기 때문에.

가 완벽한 해답 ;-) 응답 DELBA에 대한

+0

감사를해서 죄송하지, 나는 확실히 그 w 소용돌이를 줄 것이다, 입력 주셔서 감사합니다! –

+0

고마워요, 대략 해결책이었습니다. 나는 그것을 조금 비틀었다. 그러나 나는 이것이 잘 작동했을 것이다라고 확신한다. –

관련 문제