Rails의 범위는 무엇이며 왜 유용한가요?
음...
범위는 scope
를 사용하여 Rails 모델 내에서 정의하는 사용자 지정 쿼리입니다. 방법.
모든 범위에는 두 개의 인수가 필요합니다. :
- 코드에서 이 범위를 호출하는 데 사용하는 이름입니다.
- 쿼리를 구현하는 람다.
이렇게 생겼어요 :
class Fruit < ApplicationRecord scope :with_juice, -> { where("juice > 0") } end
범위를 호출한 결과로 ActiveRecord::Relation
개체.
즉, 범위를 연결하고 결합할 수 있습니다!
예 :
Fruit.with_juice.with_round_shape.first(3)
지금 :
Rails 범위에 대해 더 배울 것이 있으므로 주제를 계속 탐색해 보겠습니다.
스코프는 언제 사용하나요?
스코프는 훌륭하지만 언제 사용해야 합니까?
예를 들어 보겠습니다.
def index @books = Book.where("LENGTH(title) > 20") end
index
입니다. 20자보다 긴 제목의 책을 표시하려는 컨트롤러 작업
괜찮습니다.
하지만 이 쿼리를 다른 곳에서 사용하려면 중복된 코드가 있어야 합니다.
중복된 코드는 프로젝트를 유지 관리하기 어렵게 만듭니다.
이 쿼리를 범위로 이동해 보겠습니다.
좋아요 :
class Book scope :with_long_title, -> { where("LENGTH(title) > 20") } end
이제 컨트롤러 작업은 다음과 같습니다. :
def index @books = Book.with_long_title end
좋아요!
인수와 함께 Rails 범위를 사용하는 방법
더 유연하게 만들 수 있도록 범위에 변수를 도입할 수 있습니다.
방법은 다음과 같습니다. :
class Book scope :with_long_title, ->(length) { where("LENGTH(title) > ?", length) } end
물음표(?
)는 자리 표시자이며 length
값으로 대체됩니다. . 이렇게 하면 코드가 더 안전해집니다.
기본값을 원하는 경우 :
class Book scope :with_long_title, ->(length = 20) { where("LENGTH(title) > ?", length) } end
시도해 보세요!
범위 대 클래스 방법
스코프는 마법 같은 일이나 아주 특별한 일을 하지 않습니다.
방법일 뿐입니다.
사실... 클래스 메서드를 사용하여 동일한 작업을 수행할 수 있습니다!
좋아요 :
class Fruit def self.with_juice where("juice > 0") end end
그러나 클래스 메서드보다 범위를 사용하면 설계상의 이점이 있습니다.
이유는 :
- 구문으로 인해 범위가 더 깔끔한 코드를 생성합니다.
- 스코프는 정확히 한 가지 용도로 사용되므로 보는 순간 무엇을 얻을 수 있는지 알 수 있습니다.
- 스코프는 다른 방법과 혼합되지 않으므로 쉽게 식별할 수 있습니다.
기능면에서 유일한 차이점은 범위가 ActiveRecord::Relation
을 보장한다는 것입니다. , 클래스 메서드는 그렇지 않습니다.
이렇게 하면 스코프가 아무 것도 반환하지 않을 때 오류를 방지하는 데 도움이 됩니다.
기본 범위를 사용하지 마십시오
기본 범위는 모델에 자동으로 적용되는 범위입니다.
예 :
class Post default_scope { where(published: true) } end
네!
기본 범위가 너무 매력적입니다.
그러나 정의한 것을 잊어버리고 이상한 오류가 발생하고 디버깅에 귀중한 시간을 낭비할 수 있기 때문에 잘못된 선택인 경우가 많습니다.
그런데...
기본 범위로 작업해야 하는 경우 unscoped
를 사용해야 할 수도 있습니다. 현재 적용된 모든 범위를 비활성화하는 방법입니다.
동영상 튜토리얼 보기
요약
잘 했어! 이 기사를 읽은 결과 가장 효과적인 방법으로 Rails 범위를 사용하는 방법을 배웠습니다.
이 새로운 지식이 어떻게 작동하는지 기억할 수 있도록 실천하는 것을 잊지 마십시오.
읽어 주셔서 감사합니다. 🙂