레일 default_scope를 사용하는 것이 종종 권장되는 이유는 무엇입니까?
도처 에 인터넷 사람들은 레일을 사용하여 나쁜 생각이며, 최고 히트 유래에 그것을 쓰기 쓰기 방법에 대해입니다. 이것은 혼란스러워하고 명백한 질문을합니다.default_scopedefault_scope
레일을 사용하는 것이 default_scope권장되는 것이 무엇입니까?
문제 1
기본 예를 보겠습니다.
class Post < ActiveRecord::Base
default_scope { where(published: true) }
end
언어를 설정하려는 동기 published: true는 게시되지 않은 (비공개) 게시물을 표시하려는 경우 명시해야 할 수 있습니다. 여태대로 그런대로 잘됐다.
2.1.1 :001 > Post.all
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't'
이것은 우리가 기대하는 것과 거의 동일합니다. 이제 시도해 조치.
2.1.1 :004 > Post.new
=> #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil>
그리고 기본 범위에 대한 첫 번째 큰 문제가 있습니다.
=> default_scope는 모델 초기화에 영향을 미칩니다.
다음은 새로 생성 된 인스턴스에 default_scope반영됩니다. 게시되지 않은 게시물을 우연히 설치하지 않고 기본적으로 게시 된 게시물을 작성합니다.
문제 2
보다 정교한 예를 고려하십시오.
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts
end
첫 번째 사용자 게시물을 얻을 수 있습니다.
2.1.1 :001 > User.first.posts
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't' AND "posts"."user_id" = ? [["user_id", 1]]
(user_id에 대한 부분을 오른쪽으로 끝까지 스크롤하십시오).
이제 게시되지 않은 모든 게시물의 목록을 가져와 로그인 한 사용자의 의견을 확인합니다. 의 효과를 '덮어 쓰기'또는 '실행 취소'해야한다는 것을 알게 default_scope됩니다. 빠른 Google 검색 후에 알게 될 것 unscoped입니다. 다음에 어떤 일이 일어나는지 다음에.
2.1.1 :002 > User.first.posts.unscoped
Post Load (0.2ms) SELECT "posts".* FROM "posts"
=> Unscoped는 연결을 포함하여 (그러나 이에 국한 없음은 발생하지 않음) 선택에 따라 모든 범위를 제거합니다.
의 다른 효과를 사용하는 방법에는 여러 가지가 있습니다 default_scope. 그 권리를 얻는 것은 매우 복잡해 지고 나는 default_scope처음부터 사용하지 않는 것이 더 안전한 선택 이라고 주장 합니다.
default_scope는 종종 결과 집합을 제한하는 데 잘못 사용되기 때문에 권장되지 않습니다. default_scope를 잘 사용하면 결과 집합을 정렬 할 수 있습니다.
wheredefault_scope 에서 사용 하지 않고 범위를 만듭니다.
사용하지 않는 또 다른 이유 default_scope는 모델과 일대 다가가있는 모델 의 인스턴스를 관계 입니다.default_scope
예를 들면 다음과 같습니다.
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
를 호출 user.destroy하면 인 모든 게시물이 삭제 published되지만 인 게시물은 삭제 되지 않습니다 unpublished. 따라서 데이터베이스에는 제거하려는 사용자를 참조하는 레코드가 포함되어 있으므로 외래 키 위반이 발생합니다.
난 단지 찾을 default_scope에서만 할 몇 가지 매개 변수를 주문에 유용하게 asc또는 desc모든 상황에서 순서. 그렇지 않으면 전염병처럼 피합니다
나를 위해입니다 하지 나쁜 생각 하지만주의해서 사용해야합니다! 필드를 설정할 때 항상 특정 레코드를 숨기고 싶었던 경우가 있습니다.
- 바람직하게는,이
default_scopeDB를 기본 값과 일치해야합니다 (예 :{ where(hidden_id: nil) }) - 이러한 기록을 보여주고 싶다는 확신이 들면 항상
unscoped귀하의 기록 을 피할 수 있는 방법이 있습니다.default_scope
따라서 그것은 실제 필요에 달려 있습니다.
'IT' 카테고리의 다른 글
| 입력 인수를 기반으로 모의 기능 함수 (0) | 2020.07.16 |
|---|---|
| Promise.catch 안에 넣을 수없는 이유는 무엇입니까? (0) | 2020.07.16 |
| sudo 사건은 어디에보고? (0) | 2020.07.16 |
| Google 은이를 어떻게 관리 했습니까? (0) | 2020.07.16 |
| 메소드의 IntelliJ IDEA 힌트 매개 변수 (0) | 2020.07.16 |