2012-05-03 6 views
4

는, 액티브 first는 SQL을 생성합니다왜 레일은 ActiveRecord가 마지막으로 주문한 ID를 ID로 정렬합니까? <a href="http://guides.rubyonrails.org/active_record_querying.html" rel="nofollow">this</a>에 따르면

액티브 last가 SQL을 생성하는 반면
SELECT * FROM clients LIMIT 1 

:

SELECT * FROM clients ORDER BY clients.id DESC LIMIT 1 

first의 동작은, 내 의견에 따라, 정확하지 last에 반면에 그 입니다. 순서 지정을 지정하지 않으면 단순 SELECT가 임의의 또는 예측할 수없는 순서로 리턴됩니다. 따라서 first은 항상 동일한 레코드를 반환하도록 보장하지 않습니다 (최소 ID를 가진 레코드가 아닌 경우).

실마리가있는 사람이 있습니까? 왜 Rails ActiveRecord가 그런 식으로 작동합니까? 사전에

덕분에 Panayotis

+0

미안 해요, 난 당신을하지 않았다. 나는'first'가 항상 최소한의 id를 가진 레코드를 반환한다고 믿습니다. 어느 시나리오에서 다르게 동작합니까? – Subodh

+0

@sub_stantial'''SELECT * FROM clients LIMIT 1'''가 최소 ID를 가진 레코드를 반환한다는 것을 어떻게 알았습니까? 어딘가에 문서화되어 있습니까? [this] (http://www.ehow.com/how_2094997_sort-mysql-query-using-order.html)에 따르면 순서는 임의적이며 비 결정적입니다. 또한 [this] (http://dev.mysql.com/doc/refman/5.5/en/sorting-rows.html)에서 첫 번째 문구는 주문을하지 않는 한 결과가 특별한 순서없이 반환된다고 말합니다. 귀하의 성명을 증명할 수있는 참고 자료를 제공해주십시오. 동의하겠습니다. –

+0

나는 단지'first'가 질의에 의해 반환 된 첫 번째 결과를 반환하기를 원했을뿐입니다 ('[0]'의 별칭이 될 것입니다). 대신에,'.select'를 사용하여 의도적으로 빠뜨린'id' 칼럼을 요구하기 위해'GROUP BY' 쿼리를 변경합니다 (ID가 유일하기 때문에 그룹핑이 없기 때문에!). 그래서'.first'는 이제 "올바르게"동작하지만 "올바른"동작은 실제로 매우 나쁜 행동입니다. –

답변

1

이 게시물에 대한 답변을 얻지 못했기 때문에 다른 포럼의 다른 사람들로부터 답변을 찾으려고했습니다. ActiveRecord (또는 mysql gem)에 버그가 있다고 생각합니다. Rick James는 최소 ID를 얻으려는 경우 주문을 한도로 사용해야한다고 말합니다. Here is his answer :

http://forums.mysql.com/read.php?22,530328,530514#msg-530514

0

나는 그것이 합법적하지만 사실상 배제하지라고 생각합니다. 대부분의 DB는 순서가 지정되지 않은 경우 생성 순서대로 테이블의 내용을 반환합니다 (따라서 ID 순서대로). 그냥 작동합니다.

+1

생성 순서는 ID의 순서와 같지 않습니다. UUID와 같은 auto_increment와 같은 것들 외에 id 생성 스키마가 있습니다. –

+0

레일의 기본 ID 생성은 자동 증가를 기반으로한다고 생각합니다. 기본 ID 생성을 비활성화하고 수동으로 UUID를 설정하면 UUID를 사용할 수 있습니다. UUID와 기본 ID가없는 테이블에서'.first'와'.last'가 생성하는 레일을 확인해 보는 것이 좋습니다. – Matzi

관련 문제