복붙노트

[RUBY-ON-RAILS] 레일 모델의 기본 정렬 순서?

RUBY-ON-RAILS

레일 모델의 기본 정렬 순서?

내 모델의 기본 정렬 순서를 지정하고 싶습니다.

내가 .order를 지정하지 않고 ()가 어디에요을 수행 할 때 그래서 ()는 기본 정렬을 사용하는. 내가 .order ()를 지정하면, 그것은 기본을 무시합니다.

해결법

  1. ==============================

    1.레일 4+위한이 작품 :

    레일 4+위한이 작품 :

    class Book < ActiveRecord::Base
      default_scope { order(created_at: :desc) }
    end
    

    레일 2.3, 3의 경우, 대신이 필요합니다 :

    default_scope order('created_at DESC')
    

    레일 2.X의 경우 :

    default_scope :order => 'created_at DESC'
    

    created_at 필드가 어디에서 수행 할 기본 정렬을합니다.

    참고 : ASC는 오름차순에 사용하는 코드와 DESC는 내림차순입니다 (내림차순, NOT DSC를!).

    당신은 또한 범위를 사용할 수있는 사용하고 나면 :

    class Book < ActiveRecord::Base
      scope :confirmed, :conditions => { :confirmed => true }
      scope :published, :conditions => { :published => true }
    end
    

    레일이 들어 당신은 named_scope 필요가있다.

    : 게시 된 범위는 Book.published 대신 제공 Book.find (: 발표 => TRUE).

    레일 3부터 당신은 '체인'그들 사이의 기간으로 그들을 연결하여 함께 그 방법은, 그래서 위의 범위와 지금 Book.published.confirmed를 사용할 수 있습니다.

    실제 결과는 (게으른 평가) 필요하게 될 때까지 (7 개) 범위가 서로 연결 만 7 개 별도의 쿼리를 실행에서 성능 문제를 방지하기 위해, (1 개) 실제 데이터베이스 쿼리의 결과로 될 수 있도록이 방법을, 쿼리가 실제로 실행되지 않습니다.

    당신은 같은 날짜 또는 USER_ID (같이, 람다와 함께, 그 '게으른 평가'를해야합니다 그래서 런타임에 변경됩니다 무언가로 매개 변수에 전달 사용할 수 있습니다 :

    scope :recent_books, lambda 
      { |since_when| where("created_at >= ?", since_when) }
      # Note the `where` is making use of AREL syntax added in Rails 3.
    

    마지막으로 당신은 기본 범위를 비활성화 할 수 있습니다 :

    Book.with_exclusive_scope { find(:all) } 
    

    또는 더 나은 :

    Book.unscoped.all
    

    이는 어떤 필터 (조건) 또는 정렬 (기준 순서)이 비활성화됩니다.

    (지정되지 않은) 제 Rails2 + 반면에 제 버전 작품 Rails3 +로만되어 있습니다

    그래서 ... 당신은, 흠, 그래서이 단지 바로 이러한 범위는 무엇 다음 방법 ..., 그래, 같이 인 생각을하는 경우! 그들은 데프 self.method_name ... 코드 ... 끝을 가진 것처럼하지만 언제나 루비 그들은 당신을 위해 쉽게 일을 할 수있는 좋은 작은 구문 바로 가기 (또는 '설탕')입니다!

    그들은 '모든'기록의 1 세트에서 작동으로 사실 그들은 클래스 수준의 방법이다.

    그들의 형식은 호출 객체를 전달하지 않고 #scope를 사용하는 경우 사용 중단 경고가 4 레일, 그러나 변화하고있다. 적색 (컬러 '적색') 범위로 변화한다 : 적색 -> 예를 들면 스코프 {(색상 : "레드")}.

    잘못 사용되는 보조 노트로서, default_scope는 남용 / 오용 될 수 있습니다. 이것은이 (필터링) 제한 기본 선택 (디폴트에 대한 나쁜 생각)보다는 주문 결과에 사용되는 어디에 같은 활동을 위해 사용됩니다 경우에 대해 주로. 여기서 선택을 위해, 단지 일반라는 이름의 범위를 사용합니다. 그리고 예를 들어, 쿼리에 그 범위를 추가 게시 된 경우 명명 된 범위입니다 Book.all.published.

    결론적으로, 범위는 정말 좋은 그리고 당신은 '뚱뚱한 모델 얇은 컨트롤러'건조 방식의 모델로 일을 추진하는 데 도움이됩니다.

  2. ==============================

    2.마이클 빠른 업데이트는 위의 훌륭한 대답.

    마이클 빠른 업데이트는 위의 훌륭한 대답.

    레일 4.0 이상이 같은 블록에있는 당신의 종류를 넣어해야합니다

    class Book < ActiveRecord::Base
      default_scope { order('created_at DESC') }
    end
    

    주문 문이 중괄호로 표시 블록에 배치되는 것을 알 수 있습니다.

    이 (현재 시간과 같은) 뭔가 동적 전달 너무 쉬웠다 때문에 그들은 그것을 변경되었습니다. 블록이 실행시에 평가되기 때문에이 문제를 제거합니다. 당신이 블록을 사용하지 않는 경우이 오류가 발생합니다 :

    @Dan 아래 자신의 코멘트에 언급, 당신은이 같은 더 rubyish 구문을 수행 할 수 있습니다

    class Book < ActiveRecord::Base
      default_scope { order(created_at: :desc) }
    end
    

    또는 여러 열 :

    class Book < ActiveRecord::Base
      default_scope { order({begin_date: :desc}, :name) }
    end
    

    감사합니다 @Dan!

  3. ==============================

    3.당신은 기본 정렬 순서를 구현하기 위해 default_scope을 사용할 수 있습니다 http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html

    당신은 기본 정렬 순서를 구현하기 위해 default_scope을 사용할 수 있습니다 http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html

  4. from https://stackoverflow.com/questions/3393687/default-sort-order-for-a-rails-model by cc-by-sa and MIT license