복붙노트

[RUBY-ON-RAILS] 레일 default_scope 재정의

RUBY-ON-RAILS

레일 default_scope 재정의

나는 기본적으로 범위를 가진 액티브 :: 기본 모델이있는 경우 :

class Foo < ActiveRecord::Base

  default_scope :conditions => ["bar = ?",bar]

end

default_scope 조건을 사용하지 않고 Foo.find을 할 수있는 방법이 있습니까? 즉, 기본 범위를 재정의 할 수 있습니다?

나는 그렇지 않으면 오른쪽 GLOBAL_SCOPE과 같이 호출 할 것이다 이름으로 '기본'을 사용하여 그것을 재정의 것을 제안 할 것이라고 생각이나 했 겠어요?

해결법

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

    1.짧은 답변 : 당신이 정말로하지 않는 한 음주 default_scope를 사용하지 마십시오. 당신은 아마라는 이름의 범위와 더 나을 수 있습니다. 그렇게 말한다면 당신이 필요로하는 경우, 당신은 기본 범위를 재정의 with_exclusive_scope를 사용할 수 있습니다.

    짧은 답변 : 당신이 정말로하지 않는 한 음주 default_scope를 사용하지 마십시오. 당신은 아마라는 이름의 범위와 더 나을 수 있습니다. 그렇게 말한다면 당신이 필요로하는 경우, 당신은 기본 범위를 재정의 with_exclusive_scope를 사용할 수 있습니다.

    자세한 내용은이 질문에서보세요.

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

    2.에서 레일 3 :

    에서 레일 3 :

    foos = Foo.unscoped.where(:baz => baz)
    
  3. ==============================

    3.모두 당신이 필요 default_scope에 정의 된 순서를 변경하는 경우, 당신은 재주문 방법을 사용할 수 있습니다.

    모두 당신이 필요 default_scope에 정의 된 순서를 변경하는 경우, 당신은 재주문 방법을 사용할 수 있습니다.

    class Foo < ActiveRecord::Base
      default_scope order('created_at desc')
    end
    
    Foo.reorder('created_at asc')
    

    다음 SQL을 실행합니다 :

    SELECT * FROM "foos" ORDER BY created_at asc
    
  4. ==============================

    4.4.1 이후는 액티브을 사용할 수 있습니다 :: QueryMethods 번호가 기본 범위를 싸울 unscope :

    4.1 이후는 액티브을 사용할 수 있습니다 :: QueryMethods 번호가 기본 범위를 싸울 unscope :

    class User < ActiveRecord::Base
      default_scope { where tester: false }
      scope :testers, -> { unscope(:where).where tester: true }
      scope :with_testers, -> { unscope(:where).where tester: [true, false] }
      # ...
    end
    

    그것은 같은 물건을 unscope하실 수 있습니다 : 여기서 : 선택 : 그룹 : 순서 : 잠금, : 제한 : 오프셋 : 조인 : 포함 :에서 : 읽기 전용 : 필요.

    하지만 여전히 당신이 할 수있는 경우 default_scope의 사용을 피하십시오. 그것은 자신의 이익을 위해입니다.

  5. ==============================

    5.당신은 with_exclusive_scope 방법을 사용하여 기본 범위를 재정의 할 수 있습니다. 그래서:

    당신은 with_exclusive_scope 방법을 사용하여 기본 범위를 재정의 할 수 있습니다. 그래서:

    foos = Foo.with_exclusive_scope { :conditions => ["baz = ?", baz] }
    
  6. ==============================

    6.3 default_scope 그것은 레일 2에서했던 것처럼 오버라이드 (override) 얻을 나타나지 않습니다 레일.

    3 default_scope 그것은 레일 2에서했던 것처럼 오버라이드 (override) 얻을 나타나지 않습니다 레일.

    EG

    class Foo < ActiveRecord::Base
      belongs_to :bar
      default_scope :order=>"created_at desc"
    end
    
    class Bar < ActiveRecord::Base
      has_many :foos
    end
    
    > Bar.foos
      SELECT * from Foo where bar_id = 2 order by "created_at desc";
    > Bar.unscoped.foos
      SELECT * from Foo;  (WRONG!  removes the "has" relationship)
    > Bar.foos( :order=>"created_at asc" )  # trying to override ordering
      SELECT * from Foo where bar_id = 2 order by "created_at desc, created_at asc"
    

    내 응용 프로그램에서 PostgreSQL의 기본 범위 WINS에서 순서를 사용하여. 내 default_scopes을 모두 제거하고 명시 적으로 모든 곳에서 코딩하고 있습니다.

    함정 Rails3!

  7. ==============================

    7.레일 3+ 당신은 범위가 지정되지 않은 및 병합의 조합을 사용할 수 있습니다 :

    레일 3+ 당신은 범위가 지정되지 않은 및 병합의 조합을 사용할 수 있습니다 :

    # model User has a default scope
    query = User.where(email: "foo@example.com")
    
    # get rid of default scope and then merge the conditions
    query = query.unscoped.merge(query)
    
  8. ==============================

    8.글쎄, 당신은 항상 전체 쿼리를 이전 시간에 좋아하는 find_by_sql를 사용할 수 있습니다. 예를 들면 :     Model.find_by_sql ( "WHERE ID = 123 모델 SELECT * FROM")

    글쎄, 당신은 항상 전체 쿼리를 이전 시간에 좋아하는 find_by_sql를 사용할 수 있습니다. 예를 들면 :     Model.find_by_sql ( "WHERE ID = 123 모델 SELECT * FROM")

  9. ==============================

    9.레일에 버전 5.1이 이럴 명명 된 범위 내에서 사용 할 수있는 패션에 default_scope을 제거하기위한 이상적인 솔루션입니다 특정 열을, unscope 할 수 있습니다 (아마도 이전,하지만 난 그게 5.1에서 작동 테스트했습니다). 작전 default_scope의 경우,

    레일에 버전 5.1이 이럴 명명 된 범위 내에서 사용 할 수있는 패션에 default_scope을 제거하기위한 이상적인 솔루션입니다 특정 열을, unscope 할 수 있습니다 (아마도 이전,하지만 난 그게 5.1에서 작동 테스트했습니다). 작전 default_scope의 경우,

    Foo.unscope(where: :bar)
    

    또는

    scope :not_default, -> { unscope(where: :bar) }
    Foo.not_default
    

    윌 모두 원래의 범위를 적용하지 않지만, arel에 병합받을 다른 어떤 조건을 적용 않는 SQL 쿼리의 결과.

  10. from https://stackoverflow.com/questions/1834159/overriding-a-rails-default-scope by cc-by-sa and MIT license