2011-03-15 5 views
1

has_many 결과가있는 이벤트 모델이 있습니다. 이벤트의 필드를 기반으로 결과를 정렬하려고합니다.필드를 기반으로하는 중첩 모델의 조건부 순서

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "IF(self.etype = 'Stroke', 'results.score ASC', 'results.score DESC')" 

을 ...하지만이 deosn't 일 :

나는 현재 이벤트에 있습니다. named_scope를 사용하여이 작업을 수행하는 더 좋은 방법이 있습니까? 내 멍청한 일은 유감스럽게도 레일스 입문자입니다.

+0

왜 'self.etype'을 쿼리에 사용하고 있습니까? –

+0

'Event'의'etype '에 따라 모든 결과에 대해 다른 순서를 원합니다. – ubangy

답변

1

이 시도 :

인용 된 문자열 또는 일반 루비 코드가 속성 값으로 사용됩니다
has_many :results, :dependent => :destroy, :include => [:event], 
    :order => '#{(self.etype == "Stroke") ? 
        "results.score ASC" : "results.score DESC"}' 

, 그것은 클래스 로딩 시간에 평가됩니다. 이 경우 selfclass이 아닌 class입니다. 사용자가 손으로 개체의 속성 값을 기준으로 ORDER BY 방향을 변경하려면 사이드 작은 따옴표로 묶어야합니다. 이 경우 selfclass의 인스턴스입니다.

+0

문자열을 왜 귀찮게합니까? '(self.etype == "Stroke")? "results.score ASC": "results.score DESC" ' –

+0

인용 문자열 또는 일반 루비 코드를 사용하면 클래스 로딩 시간에 값이 계산됩니다. 이 경우'self'는'Class'의 인스턴스가 아니라'Class'입니다. 사용자가 인스턴스의 속성 값을 기반으로 'ORDER BY'방향을 변경하기를 원하기 때문에 조건은 작은 따옴표로 묶어야합니다. –

+0

이제 "SQLite3 :: SQLException : 인식 할 수없는 토큰 :"# ": ..."이 표시됩니다. 어떤 아이디어? – ubangy

0

해결 되었습니까?

has_many :results, :dependent => :destroy, :include => [:event], :order => "IF(results.etype = 'Stroke', 'event.score ASC', 'event.score DESC')" 

하지 않으면 콘솔에서이 작업을 수행하려고 할 때 어떤 오류가 반환됩니다

Event.first.results 
+0

나는 그것이 이치에 맞지 않기 때문에이 순간조차하지 않았다. 'score'는'Result'에 있고'etype'는'Event'에 있습니다. – ubangy

+0

이벤트 결과가 아닌 결과 필드를 기반으로 결과를 정렬 하시겠습니까? 귀하의 질문에 반대했다. – ctide

0

이 시도 :

레일의 3.0.x 버전에서 :

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

레일 3.xx :

has_many :results, :dependent => :destroy, :include => [:event], 
    :order => "#{(proxy_association.owner.etype == 'Stroke') ? 
        'results.score ASC' : 'results.score DESC'}" 

희망이 도움이됩니다.

관련 문제