생각을 개발하자, 박진형

[rails] 레일즈 모델 - 쿼리 인터페이스 스코프 본문

Likelion/rails

[rails] 레일즈 모델 - 쿼리 인터페이스 스코프

imjinbro imjinbro 2017.03.03 11:36

[스코프란]

- 자주 사용하는 쿼리메서드를 사용하기 간편하게 하는 방법, 하나의 예약어로 묶은 다음, 예약어를 호출하여 사용하는 방법

- 또는 쿼리메서드를 사용하여 레코드 작업 시 쿼리메서드에 기본적으로 설정하고싶은 설정사항을 넣어두는 방법


[스코프 종류]

- named scope : 자주 사용하는 쿼리메서드를 사용하기 간편하게 하는 방법

- default scope : 테이블 레코드 작업(모델 쿼리메서드)을 할 시에 기본적으로 적용받는 설정을 저장함, 수정/제거 작업 이외에도 생성에도 영향을 미침


[스코프 사용하기]

- named scope

1) 적용하고싶은 모델 클래스 파일을 연다(app > models > 적용하고싶은 모델클래스 이름.rb)

2) scope :스코프이름, -> { 적용할 쿼리(ActiveRecord::Relation을 반환해야함 - find, find_by 등은 사용x) } 

3) 사용하기

- 적용하고자 하는 컨트롤러 파일을 연다 -> 모델클래스명.스코프이름 -> 스코프 적용해두었던 쿼리메서드가 동작함

- 병합사용 가능함 : 두개 이상의 스코프를 같이 사용하면 쿼리문에 AND가 붙음(AND로 연결)

- 파라미터를 받아서 사용 가능함

- 일반 쿼리메서드와 혼용 가능함

예시) scope :what, -> { select(:user_name, :user_num) } 


4-1) 응용해서 사용하기 - 병합해서 사용하기

- 모델 클래스명 - Book

- scope :what, -> { select(:title, :price)}

- scope :cheap, -> { order(price: :desc) } 

- scope :best5, -> { cheap.limit(5) }

- 컨트롤러 사용 : Book.what.best5 - best5는 limit으로 chain 되어있어서 실제 동작은 what -> cheap -> best5 순서로 동작을 한다.


4-2) 응용해서 사용하기 - 파라미터 받기

- scope :what_category, -> (category) { where("category == ?", category) }

- 컨트롤러 사용 : 모델클래스명.스코프이름(파라미터) -> Book.what_category("역사")


- default scope 

1) 적용하고싶은 모델 클래스 파일을 연다(app > models > 적용하고싶은 모델클래스 이름.rb) 

사용하기1) default_scope { 적용할 쿼리(ActiveRecord::Relation을 반환해야함 - find, find_by 등은 사용x) }

사용하기2) 사용방법 1에서 적용하는 쿼리가 복잡할 경우 메서드 형태로 정의가능하다.

- 메서드명 : self.default_scope  - self는 모델 클래스의 객체를 뜻함, 각 객체(현 클래스)에 대한 default_scope

- 사용하기

def self.default_scope

쿼리문(ActiveRecord::Relation으로 반환되어야함)

end


[모든 스코프 삭제하기]

- unscoped.all 

- 가장 기초 쿼리로 돌아옴, 적용된 스코프 해제, { } (블록)을 사용할 수 있음, 적용된 모든 쿼리메서드 삭제

- 사용하기

Book.unscoped {

#설정사항 넣기

}


[스코프 참고자료]

- 공식 API 문서 : http://guides.rorlab.org/active_record_querying.html