우리는 Ruby를 사랑합니다 {Method Chaining}
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에서 메소드 체이닝의 힘을 실험하고 더 발견할 차례입니다! 즐거운 코딩하세요!
Reference
이 문제에 관하여(우리는 Ruby를 사랑합니다 {Method Chaining}), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/allisonkim/we-love-ruby-method-chaining-1f78텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)