2013-10-18 3 views
1

다음과 같은 모델이 있다고 가정 해 봅시다. 가장 긴 회의를 수집하고 마지막 짧은 회의 첫 회의가되도록날짜 범위로 정렬

create_table :meetings do |t| 
    t.datetime :started_at 
    t.datetime: ended_at 
end 

class Meeting < ActiveRecord::base 
end 

어떻게는 meetings_result를 주문한다. 그래도 문제가 해결되지 분명히

Meeting.order(longest(started_at..ended_at)) 

같은

뭔가.

원시 SQL을 사용하지 않고 어떻게하면 좋을까요?

답변

1

원시 SQL을 사용하지 않고도 할 수 있다고 생각하지 않습니다.

Meeting.order('(ended_at - start_at) DESC') 

(PostgreSQL을 함께 작동)

+0

충분히 우아하게 보입니다. 감사. – Arjan

+0

@Arjan을 환영합니다! 질문에 맞는 대답을 수락해야합니다. – MrYoshiji

+0

예, 수락을 취소했습니다. 작동하지 않았기 때문입니다. 하지만 이는 기본 범위와 관련이 있습니다. 다시 한번 감사드립니다. – Arjan

0

없음 SQL :

원시 SQL을 사용하십니까? 두 가지 옵션이 떠오른다. 해시의 배열을 만들고 거기에 정렬하거나, db에 다른 열을 추가하고 정렬하십시오.

# How many records in the meetings table? This array of hashes could get huge. 
meetings_array = [] 
Meeting.all.each do |meeting| 
    meetings_array << {id: meeting.id, started_at: meeting.started_at, ended_at: meeting.ended_at , duration: meeting.ended_at - meeting.started_at } 
end 
meetings_array.sort_by { |hsh| hsh[:duration] } 

또는 다른 열 생성 : 당신이 started_atended_at 모두있을 때마다

# Is it worth adding another column? 
create_table :meetings do |t| 
    t.datetime :started_at 
    t.datetime :ended_at 
    t.datetime :duration 
end 

갱신이 열을. 그러면 다음을 수행 할 수 있습니다.

Meeting.order("duration") 
+0

날짜/시간 열에 기간을 저장하는 방법은 무엇입니까? – Arjan

+0

이것은 간단한 순서에 너무 많은 것입니다. 첫 번째 해결책 : 루비를 사용하여 기간을 계산하지만 SQL은 쉽게 할 수 있습니다. 두 번째 해결 방법 : 객체 업데이트, 가능한 0 값, 그리고 이미 2 열에 저장된 데이터입니다. started_at & ended_at – MrYoshiji

+0

@MrYoshiji, 전적으로 당신과 동의합니다 :-) 그냥 대답합니다. 그것은 제약에 따라. 내가 추가 한 의견에 유의하십시오. – AdamT