2014-12-02 1 views
1

ID를 나타내는 URL에 몇 가지 매개 변수가 있습니다. 이 페이지에서 기사 목록을 인쇄합니다 - 보통 50-70 사이입니다.특정 순서로 데이터베이스에서 레코드를 정렬하는 방법을 레일스?

URL에 ID는 - 예 : website.com/mark/articles/10/12/13/20 (기사 ID : 10, 12, 13, 20) 형식입니다.

나는 배열에이 ID를 절약 할 수와 페이지에있는 모든 마크의 기사를 인쇄하는 동안, 나는 기사에게 ID를 10, 12, 1320와 기사 목록의 상단에있을 것입니다 방법을 정렬 할 필요가있다 .

어떻게 이런 식으로 달성 할 수 있습니까?

+0

네 개의 기사 만 표시하고 있습니까? 그렇지 않으면 보조 정렬 키는 무엇입니까? –

+0

모든 기사와 그 위에 4 개의 기사를 표시하고 있습니다. – user984621

답변

2

, 무의 답변을 확인합니다. 루비를 사용 : 당신이 Relation 아닌 Array 필요한 경우 물론

articles = Article.where(id: ids).index_by(&:id).values_at(*ids) + 
    Article.where.not(id: ids) 

하는 SQL 솔루션은 좋네요.

+0

@tokland, 답변 해 주셔서 감사합니다. 그러나 URL에 지정된 ID가있는 기사 만 표시됩니다. 모든 기사를 표시하고 URL에있는 기사별로 정렬해야합니다 (URL에있는 기사는 기사 목록의 시작 부분에 표시됩니다) – user984621

+0

내 잘못되어 업데이트되었습니다. – tokland

1

두 가지 방법이 있습니다. 일반 루비 또는 SQL.

평원 루비 버전

아마 가능 SQL 주입에 이해하기 쉽고 또한 취약하지 않습니다 :

article_ids_on_top = [10, 12, 13, 20] 
articles = Article.all 
top_articles = articles.select{|article| article_ids_on_top.include?(article.id) } 
bottom_raticles = articles.reject{|article| article_ids_on_top.include?(article.id) } 

@articles = top_articles + bottom_articles 

SQL 버전 :는 SQL 솔루션

article_ids_on_top = [10, 12, 13, 20] 
@articles = Article.order("FIELD(id, [#{article_ids_on_top.join(',')})") 
+1

'FIELD'는 MySQL-ism이 아닙니까? –

+0

@Milan이 답변 해 주셔서 감사합니다. SQL 버전을 사용하려고 할 때 대괄호'['']'를 잘못 사용하는 것에 대한 오류를 반환합니다. 대괄호없이 괄호를 사용하면 오류는 사라지지만 데이터는 제대로 정렬되지 않습니다. – user984621

관련 문제