IT

레일 default_scope를 사용하는 것이 종종 권장되는 이유는 무엇입니까?

lottoking 2020. 7. 16. 07:56
반응형

레일 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모든 상황에서 순서. 그렇지 않으면 전염병처럼 피합니다


나를 위해입니다 하지 나쁜 생각 하지만주의해서 사용해야합니다! 필드를 설정할 때 항상 특정 레코드를 숨기고 싶었던 경우가 있습니다.

  1. 바람직하게는,이 default_scopeDB를 기본 값과 일치해야합니다 (예 : { where(hidden_id: nil) })
  2. 이러한 기록을 보여주고 싶다는 확신이 들면 항상 unscoped귀하의 기록 을 피할 수 있는 방법이 있습니다.default_scope

따라서 그것은 실제 필요에 달려 있습니다.

참고 URL : https://stackoverflow.com/questions/25087336/why-is-using-the-rails-default-scope-often-recommend-against

반응형