2016-07-24 2 views
-1

시나리오는 2 가지 경우에 대해 모든 타임 슬롯을 가져오고 싶습니다.코드 4를 리팩터링 할 수 없습니다. 쿼리

  1. 도어맨에 해당하는 경우 쿼리가

  2. 도어맨이 다음 쿼리에

그래서를 매개 변수를 추가하기 위해 거짓 필요한 경우, 그 같은 쿼리 거의 그 뜻 동일합니다 거의 수정하지 않고 두 경우에 모두 사용할 수 있습니다.

다음은 쿼리 및 코드 :

def self.latest_pickup_date current_zone,doorman 
    if doorman 
     latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone).order(:slot_date).last 
    else 
     latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone, doorman_type: "none").order(:slot_date).last 
    end 
    latest_timeslot.nil? ? Date.current : latest_timeslot.slot_date 
    end 

내가 DRY의 접근 방식을 사용하는 방법에 내 코드와 쿼리를 리팩토링하고 싶습니다.

두 경우 모두이 쿼리를 두 번 쓰고 싶지 않습니다. 코드 실습을 사용하여 더 나은 솔루션이 필요합니다. 또는 내가이 올바른 방법으로 일하고 있다면 조언을받을 수 있습니다.

플러스 누군가가 도움을 줄 수있는 좋은 전문적인 코드 관행과 코드 리팩토링이 필요합니다.

+0

귀하의 질문 제목 refactor_ 할 _unable입니다 비어있는 경우 try를 사용하여, 당신은 왜이다 리팩토링 할 수 없습니까? http://codereview.stackexchange.com/에 대해 알고 있습니까? –

+0

@ Зелёный 전문가의 답변을 얻기 위해 게시 한 전문 지식이 많지 않아 전문 지식이 부족합니다. 제 의도는 대답 만하는 것이 아닙니다. 나는 나 자신을 할 수있다. 잘 codereview.stackexchange.com에 대해 모르겠다 – LearningROR

+0

이 질문을 http://codereview.stackexchange.com/ –

답변

2

당신은 그냥 기존 쿼리에 where을 할 수있는 추가 조건을 추가하고, 쿼리가

def self.latest_pickup_date current_zone,doormam 
    latest_timeslot = Timeslot.where(dropoff_slots: '-1', zone_id: current_zone).order(:slot_date) 
    latest_timeslot = latest_timeslot.where(doorman_type: 'none') unless doorman 
    latest_timeslot.last.try(:slot_date) || Date.current 
end 
+0

이 방법을 사용하십시오. 이것은 가장 깨끗한 해결책입니다. –

+0

코드는 두 개의 쿼리를 작성하지만, 하나만 만들 수있는 반면 코드는 나쁜 방식으로 시도합니다. –

+0

나는 또한 같은 우물을 생각하고있다. 2 개의 쿼리를 만드는 것처럼 보입니다. 어쨌든 정말 잘 작동합니다. 왜 '시도'가 나쁜 습관입니까? – LearningROR

1

다음과 같은 리팩터링 된 코드를 확인해 주실 수 있습니까?이 방법이 마음에 드시면 알려 주시기 바랍니다.

def self.latest_pickup_date current_zone,doorman 
    filters = {dropoff_slots: '-1', zone_id: current_zone} 
    filters[:doorman_type] = "none" unless doorman 

    latest_timeslot = Timeslot.where(filters).order(:slot_date).last 

    latest_timeslot.nil? ? Date.current : latest_timeslot.slot_date 
end 
+0

에 게시해야합니다. 코드에 주석도 추가 할 수 있습니까? 고마워. 좋아 보인다. – LearningROR

+0

기본적으로 where 절은 사전을 허용합니다. 따라서 필터 열과 값을 따로 전달하거나 사전을 전달할 수 있습니다. 사전에서 키는 열 이름이어야하며 값은 필터링에 사용하려는 값이어야합니다. # 첫 번째 두 개의 필드 필터 [: doorman_type] = "없음"도어맨 #The 선택적 필드를 제외하고 latest_timeslot = 타임 슬롯 그게 내가, = {: '-1', zone_id current_zone dropoff_slots} 필터가 여기에 무엇을했는지이다 .where (: filters) .order (: slot_date) .last # 필터 doorman이 null이 아닌 경우 doorman_type을 사전에 추가합니다. – Pragash

+0

알았어요 - 필터를 더 많이 읽을 수있는 링크를 추가 할 수 있습니까? 더하기 한가지 :'filters [: doorman_type]'이 코드는 필터에 다른 키를 추가하고 있습니까? 내가 맞습니까? 우리의 사전에'filters [: doorman_type]'을 추가하는 다른 두 개의 키워드를 사용하고 싶습니까? – LearningROR

관련 문제