2013-09-16 2 views

답변

2

일부 활성 레코드 버전은 기본 순서를 먼저 쿼리에 추가하고 마지막 순서를 추가하지 않으므로 Postgres의 기본 동작 인 것으로 보입니다.

https://github.com/rails/rails/issues/9885

PostgreSQL은 기본적으로 일반적으로 성능 좋은 일이 일종의을 적용하지 않는다.

따라서 "첫 번째"는 "의미없는 키 값으로 정렬 된 첫 번째 행"이 아니라 "첫 번째 행이 반환되었습니다"를 의미합니다.

신기하게 "마지막"은 이드가 주문한 것처럼 보입니다.

+0

Model.last 레일에서 id desc로 주문합니다. –

+1

Rails 4에 있습니다.이 문제도 해결되었습니다. Model.first는 id 오름차순으로 정렬됩니다. –

+0

예 - 첫 번째 동작은 RDBMS에 따라 다릅니다. 그것은 일관성이 없기 때문에 호기심이 많습니다. Rails가 마지막으로 "가장 높은 기본 키 값을 가진"의미를 매우 좋아한다면 Rails가 데이터베이스에 남겨 두는 대신 "첫 번째"에 대한 동작을 지정할 수도 있습니다. –

3

Model.first는 데이터베이스의 기본 정렬을 사용합니다. 예를 들면. Postgresql의 기본 정렬은 반드시 ID 일 필요는 없습니다.

+2

실제로 PostgreSQL에서는 기본 정렬이 전혀 없습니다. 신에게 감사드립니다. 어쨌든 모든 것은 매우 적극적인 버전 의존적입니다. –

0

직접 주문해야합니다. 시도해보십시오 Merchant.order('id ASC').first 모델의 기본 범위를 사용하여이를 자동화 할 수는 있지만 확실치 않습니다.

1

다른 주문 조건이 지정되지 않은 경우 기본 키순으로 정렬하려면 here이 레일 4에 정의되어 있습니다. 레일 3.2.11에서

, 그것은 같은 것입니다 : 그냥 제한을 적용하고 데이터베이스에 주문을 떠날 것이다 order 방법없이

def find_first 
    if loaded? 
    @records.first 
    else 
    @first ||= limit(1).to_a[0] 
    end 
end 

.

관련 문제