2012-11-26 7 views
0

나는 Event라는 모델 클래스와 'when'필드를 가지고 있습니다. 내가 desc 때 이벤트 순서를 반환하려고, 그래서 여기 코드입니다.레일스 활성 레코드 주문 문제

@events = Event.order("'when' DESC") 

데이터베이스로 MySQL을 사용하고 있습니다. 결과가으로 정렬되지 않았습니다.

나는 콘솔에보고하고, 파일

SELECT `events`.* FROM `events` ORDER BY 'when' DESC 

와 나는 또한 콘솔에서이 SQL을 실행 좋아 보인다 생성 된 SQL을, 그리고 정렬 된 결과를 반환했습니다. '언제'와 특별한 것이 있습니까? 내가 Event.order("events.when DESC") 내 쿼리를 변경 한 경우

는, 다음은 정렬 된 결과

답변

2

이 역 따옴표해야하지 따옴표를 반환했습니다.

@events = Event.order("`when` DESC") 

당신이 single quote를 사용

주위 when 그것은 더 이상 열하지만 단순히 문자열 값이 아닙니다. tableName과 columnName으로 이스케이프 될 때 싱글 대신 백틱을 사용해야합니다.

+1

정말로 '따옴표/백틱'이 필요할 경우 'Event.order ('DESC '일 때)'가 트릭을해야하는지 확실하지 않습니다. 적어도 그것은 저를 위해 작동합니다 – MrYoshiji

+0

@KuyaJohn 그것은 선택 사항이 아닙니다. 옵션이 아니며, 역 인용 부호가없는 경우 SQL 구문 오류가 발생합니다. – fengd

+1

@MrYoshiji backtick, * [** MySQL 예약어 **] (http://dev.mysql.com/doc/refman/5.5/en) 목록에 WHEN이 있기 때문에 * 필요하다고 생각합니다. /reserved-words.html) –

0

필드에 추가 할 작은 따옴표를 제거 할 수 있습니다.

@events = Event.order("column_name DESC") 

when는 예약어 귀하의 경우를 제외하고, COLUMN_NAMES을 위해 일반적으로 사실이다 : 그것은 같은 모든 일의 주위에 따옴표와 함께 작동합니다. 그래서 당신은 다음을 백틱해야합니다

@events = Event.order("`when` DESC") 

을하지만 여전히, 당신의 열 이름을 변경 권하고 싶습니다, 당신은 결국 예약어를 사용하여 합병증으로 실행하겠습니다. when도 내 의견으로는 설명하기 쉽지 않습니다. 이벤트가 생성/주문되었을 때입니까? 이벤트가 시작될 때? 이벤트가 끝나면? 아마도 occurring_at 또는 date_occurring 열 이름이 더 자세하게 나옵니다.

+0

아니요, 구문 오류로 연결됩니다. – fengd

+0

WHEN이 [** MySQL 예약어 **] 목록에 있습니다 (http://dev.mysql.com/doc/refman/5.5/en/ reserved-words.html) –

+0

아! 알아 둘만한. 이 경우 @ Jun1st 열의 이름을 바꾸는 것이 가장 좋습니다. 나는 대답을 적절하게 편집 할 것이다 ^^ – joofsh

관련 문제