2012-08-26 2 views
1

고급 주문에 대한 대부분의 질문에는 몇 가지 우선 순위가있는 필드가 있지만 여기에는 다른 문제가 있습니다.레일 3의 선택적 주문

본인은 제목으로 주문 된 일련의 프로젝트가 있으며,이 프로젝트는 회사의 개인에게 할당됩니다. 각 개인의 프로젝트를 float 위에 올릴 수 있기를 원합니다. 그 개인은입니다.

assigned_individual 다음으로 주문 요청이 아닙니다. job_title (내 프로젝트가 아닌 모든 프로젝트의 주문이 엉망이되기 때문에). 이는 주로 job_title에 의해 여전히 주문 된 레코드를 가지고 있지만, 먼저 assigned_individual_id = 3과 같은 레코드가 우선 표시되도록하는 오버라이드가있는 요청입니다. 2 개 패스에서

답변

1

아니, 그냥 수동으로 정상에 관심있는 행을 밀어하여 주문에 CASE 슬립해야, 이런 식으로 뭔가 : 물론, id는 사용자

id = M.send(:sanitize_sql, ['?', id]) 
M.order("case when assigned_individual = #{id} then 0 else 1 end, job_title") 

이고, 그 당신은 정상에 싶습니다. 이것이 M의 방법 중 하나에서 수행된다면, 보호 범위 sanitize_sql을 피하기 위해 send을 사용할 필요가 없습니다.

이 기술을 쉽게 확장하여 여러 사용자를 맨 위로 밀어 넣을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 왜 우리는 첫 번째 라인이 필요한가요? send/sanitize_sql은'id = M.find (5)'와 같은 것을 얻지 못합니다. – sscirrus

+0

@sscirrus :'M.find (5)'는 객체를 문자열로 보간하면 원하는 SQL을 제공하지 못할 것입니다. 'sanitize_sql' 호출이 SQL에 포함시키기 위해'id'를 적절하게 벗어나기 위해 필요합니다. –

0

빌드를 :

@projects = current_user.projects 
@projects += Project.all 
@projects.uniq! 

NB : 나는 당신 이름으로 프로젝트를 주문하려면 기본 범위를 사용했다고 가정합니다. 하드