우리는 Ruby를 사랑합니다 {Method Chaining}

3830 단어 sqlruby
많은 개발자들이 단순화되고 구어체에 가까운 특성 때문에 Ruby로 프로그래밍하는 것을 좋아합니다. 예를 들어 Ruby 코드 한 줄은 다음과 같습니다.

my_age = 26
puts "Unable to purchase alcohol" unless my_age >= 21


보통 영어로 "내 나이가 21세 이상이 아니면 '술을 살 수 없다'는 터미널에 내놓으세요."라고 거의 읽을 수 있습니다.

이것은 Ruby 디자이너인 Yukihiro "Matz"Matsumoto의 목표였습니다. 궁극적으로 사용하기 쉽고 작성하기 직관적이며 프로그래머를 행복하게 만드는 언어를 만드는 것입니다.

저는 Ruby의 메소드 체이닝 스타일로 복잡한 코드 라인을 얼마나 단순화할 수 있는지를 통해 Ruby를 좋아한다는 것을 알게 되었습니다.

Method chaining is a convenient way to build up complex queries, which are then lazily executed when needed. Within the chain, a single object is updated and passed from one method to the next, until it's finally transformed into its output value.

-Jeff Kreeftmeijer



재미있는 예를 함께 살펴보겠습니다.

무대를 설정하기 위해 우리가 옷가게이고 Ruby(ActiveRecord와 함께)를 사용하여 SQL 데이터베이스를 구축하고 액세스한다고 가정해 보겠습니다. 우리 프레임워크에서는 각 고객과 고객이 구매하는 제품 사이에 일대다 관계가 있습니다. 즉, 제품은 한 고객에게만 속할 수 있지만 한 고객은 많은 제품을 가질 수 있습니다. 스키마(SQL 테이블 빌드)에서 각 고객에게는 고유한 ID가 부여되며 제품 테이블에는 각 제품에 대한 외래 키로 고객 ID가 있습니다.

이제 매장으로서 우리는 $$ 수익성이 가장 높은 $$ 고객(가장 많은 제품을 구매한 고객)에게 모든 비즈니스에 대한 감사의 표시로 선물을 제공하고자 합니다. 의사 코드에서 이를 수행하는 방법은 각 고객이 구매한 모든 제품을 세고 최대 개수로 고객을 잡는 것입니다. 해결책:

id = Customer.joins(:products).group(:id).count
  .max_by { |id,count| count }[0]
Customer.find(id)


이것을 분석해 보겠습니다.
Customer는 고객 모델을 나타내기 위해 정의한 클래스입니다.
joins(:products)는 SQL INNER JOIN을 수행하여 제품 테이블에 있는 각 제품의 각 고객이 반환되는 고객 목록을 컴파일합니다.
group(:id)는 인수로 정의된 열에서 동일한 값을 공유하는 모든 반복 요소를 결합합니다. 이 경우 동일한 고유 ID를 공유하는 모든 고객을 결합하고 고유 고객 목록을 반환합니다.
count 목록의 요소 수를 반환합니다. 그러나 group 와 함께 적용하면 각 고유 요소에 대한 반복 요소 수를 제공합니다. 이것은 다음과 같이 각 고유 요소에 대한 키-값 쌍으로 반환됩니다.

# format: {id=>count}
{1=>2, 2=>1, 3=>1, 4=>2} ,


여기서 요소 ID 1의 개수는 2이고 요소 ID 2의 개수는 1입니다.
max_by { |obj| block }block 조건에 따라 최대값을 가진 개체를 반환합니다. 솔루션에서는 {id,count} 메서드에서 반환된 각 개체( count )를 가져와 최대 개수의 개체를 반환합니다. 개체는 배열 형식[id, count]으로 반환되므로 솔루션의 끝에서 ID만 가져오기 위해 [0]를 추가합니다.

이제 제품이 가장 많은 고객의 ID가 있으므로 Customer 클래스에서 find(id) 메서드를 사용하여 해당 고객의 인스턴스를 반환할 수 있습니다. 그리고 그게 다야!

Ruby에서 메소드 체이닝의 힘을 실험하고 더 발견할 차례입니다! 즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기