[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.짧은 답변 : 당신이 정말로하지 않는 한 음주 default_scope를 사용하지 마십시오. 당신은 아마라는 이름의 범위와 더 나을 수 있습니다. 그렇게 말한다면 당신이 필요로하는 경우, 당신은 기본 범위를 재정의 with_exclusive_scope를 사용할 수 있습니다.
짧은 답변 : 당신이 정말로하지 않는 한 음주 default_scope를 사용하지 마십시오. 당신은 아마라는 이름의 범위와 더 나을 수 있습니다. 그렇게 말한다면 당신이 필요로하는 경우, 당신은 기본 범위를 재정의 with_exclusive_scope를 사용할 수 있습니다.
자세한 내용은이 질문에서보세요.
-
==============================
2.에서 레일 3 :
에서 레일 3 :
foos = Foo.unscoped.where(:baz => baz)
-
==============================
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.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.당신은 with_exclusive_scope 방법을 사용하여 기본 범위를 재정의 할 수 있습니다. 그래서:
당신은 with_exclusive_scope 방법을 사용하여 기본 범위를 재정의 할 수 있습니다. 그래서:
foos = Foo.with_exclusive_scope { :conditions => ["baz = ?", baz] }
-
==============================
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.레일 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.글쎄, 당신은 항상 전체 쿼리를 이전 시간에 좋아하는 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.레일에 버전 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 쿼리의 결과.
from https://stackoverflow.com/questions/1834159/overriding-a-rails-default-scope by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 암호가없는 고안 사용자 업데이트 (0) | 2020.02.09 |
---|---|
[RUBY-ON-RAILS] 3 유증 레일, CURRENT_USER는 모델에 액세스 할 수 없습니다? (0) | 2020.02.09 |
[RUBY-ON-RAILS] 레일 : 유효성 검사 링크 (URL을)에 좋은 방법 무엇입니까? (0) | 2020.02.09 |
[RUBY-ON-RAILS] 루비 번들 기호를 찾을 수 없습니다 : _SSLv2_client_method (LoadError) (0) | 2020.02.09 |
[RUBY-ON-RAILS] 루비 온 레일 및 유증에 여러 사용자 모델은 별도의 등록 경로하지만 하나 개의 공통 로그인 경로가합니다 (0) | 2020.02.09 |