[ruby-on-rails] Rails에서 scope / named_scope는 무엇입니까?

최근에 인턴십을 시작했습니다. 내 고용주는 레일에서 루비를 사용하고 있으며 이해하기 위해 찾아봐야하는 새로운 구문을 자주 접합니다. named_scope에 대한 좋은 설명을 찾기 위해 검색을 해봤지만 지금까지 찾은 것은 대부분 블로그 게시물이 칭찬을주는 것이지 직접적인 정의 나 소개였습니다.

레일 위의 루비에서 named_scope (이제 간단히 스코프라고 함)는 정확히 무엇입니까?



답변

범위는 컬렉션의 하위 집합입니다. 복잡하게 들리나요? 그렇지 않습니다. 이것을 상상해보십시오.

사용자가 있습니다. 이제 일부 사용자는 뉴스 레터를 구독하고 있습니다. 사용자 데이터베이스에 필드를 추가하여 뉴스 레터를받는 사람들을 표시했습니다 (user.subscribed_to_newsletter = true). 당연히 뉴스 레터를 구독하는 사용자를 원할 때도 있습니다.

물론 항상 다음과 같이 할 수 있습니다.

User.where(subscribed_to_newsletter: true).each do #something

그러나 항상 이것을 작성하는 대신 다음과 같이 할 수 있습니다.

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, where(subscribed_to_newsletter: true)
  #yada yada
end

Rails 4 이상을 사용하는 경우 대신 다음을 수행하십시오.

#File: users.rb
class User < ActiveRecord::Base
  scope :newsletter, -> { where(subscribed_to_newsletter: true) }
  #yada yada
end

이렇게하면 다음과 같이 간단히 구독자에 액세스 할 수 있습니다.

User.newsletter.each do #something

이것은 매우 간단한 예이지만 일반적으로 범위는 작업을 쉽게하는 매우 강력한 도구가 될 수 있습니다.

이 링크를 확인하십시오 : API 설명


답변

활성 레코드의 범위는 클래스 메서드와 비슷하지만 Relation 개체를 반환하므로 다른 범위 또는 활성 레코드 쿼리 메서드를 호출 할 수 있습니다.

예를 들어 아래에 언급 된 범위 방법이있는 Zombie 모델 (zombies 테이블)이있는 경우

class Zombie
  scope :rotting, -> { where(rotting: true) }
  scope :fresh, -> { where('age < ?', 25) }
  scope :recent, -> { order(created_at: :desc) }
end

그리고 당신은 전화

Zombie.rotting.fresh.recent.limit(3)

SQL에서 아래로 번역됩니다.

select "zombies.*" from "zombies" where "zombies"."rotting" = 't' and (age<20) order by create_at desc limit 3

위의 예는 rails 4 구문을 기반으로합니다.


답변

세부 사항을 이해하는 가장 좋은 방법은 API 문서로 이동하는 것입니다.

전체 세부 정보와 범위를 사용할 수있는 방법을 얻을 수 있습니다.

범위의 API 문서


답변

범위는 클래스 메서드 일뿐입니다.

왜 사용합니까?

범위 지정을 사용하면 연관 개체 또는 모델에 대한 메서드 호출로 참조 할 수있는 일반적으로 사용되는 쿼리 (길거나 가장 자주 사용되는 쿼리의 바로 가기로 간주 될 수 있음)를 지정할 수 있습니다. 이러한 범위를 사용하면 where, joins 및 includes와 같이 이전에 다룬 모든 방법을 사용할 수 있습니다. 모든 범위 메서드는 ActiveRecord :: Relation 개체반환하여 추가 메서드 (예 : 다른 범위)를 호출 할 수 있도록합니다.

간단한 범위를 정의하기 위해 클래스 내에서 범위 메서드를 사용하여이 범위가 호출 될 때 실행할 쿼리를 전달합니다.

class Article < ActiveRecord::Base
  scope :published, -> { where(published: true) }
end

이것은 클래스 메소드를 정의하는 것과 똑같으며, 사용하는 것은 개인적 선호도의 문제입니다.

class Article < ActiveRecord::Base
  def self.published
    where(published: true)
  end
end

예제와 함께 전체 설명을 보려면 다음 링크를 따르십시오. 이것이 도움이되기를 바랍니다.

http://guides.rubyonrails.org/active_record_querying.html


답변

  • Person 모델이 있다고 상상해보십시오 .

이제 당신을 상상해보십시오.

  • 빨간 머리를 가진 세상의 모든 사람들을 원합니다.
  • 크리켓을하는 세계의 모든 사람들을 원해

범위를 사용하여 특정 클래스의 사람들을 얻을 수 있습니다!

Person.red_hair.cricket ## finds all people with red hair who play cricket
Person.red_hair ## finds all people with red hair
Person.cricket ## finds all people who play cricket.

이제 그렇게 어렵지 않았나요?


답변