2012-09-11 4 views
0

데이터베이스의 행을 찾거나 새 행을 만드는 데이 코드 행을 사용하고 있습니다. 일하고 있지만 그것은 매우 추악하고 유지하기 어렵게 보입니다. 코드의 매우 긴 라인이 당신이 볼 수 있듯이 여기 레일에서 코드 찾기 또는 정리 방법

return_policy_id= MyEbayReturnPolicy.find_or_create_by_active_and_name_and_ebay_marketplace_id_and_returns_within_and_returns_accepted_and_warranty_offered_and_warranty_duration_and_warranty_type_and_shipping_costs_paid_by_and_refunds(active,name,ebay_marketplace_id,returns_within,returns_accepted,warrenty_offered,warranty_duration,warranty_type,shipping_costs_paid_by,refunds) 

는 find_or_create 코드

def self.find_or_create(search, *args, &block) 
    parameters = search.split("_and_") 
    params = Hash[ parameters.zip(args) ] 
    obj = where(params).first 
    if(obj.nil?) 
     obj = self.new(params); 
     obj.save 
    end 
    return obj; 
    end 

입니다.

이 코드를 멋지고 깨끗하게 보이게 유지하는 데 더 나은 방법이 있는지 알고 싶었습니다.

감사합니다. 내 제안 사항에 따라

+0

스코프 + where 절을 사용하십시오. 읽을 수 없음을 확인했습니다. – apneadiving

+0

스코프 및/또는 간단한 조건을 사용할 수 없습니까? –

답변

3

레일즈 3.2는 first_or_create을 도입했다 (다른 유사한 방법들 중에서도). 당신은 그것을 활용할 수 있습니다 :

MyEbayReturnPolicy.where(
    active:     active, 
    name:     name, 
    ebay_marketplace_id: ebay_marketplace_id, 
    returns_within:   returns_within, 
    returns_accepted:  returns_accepted, 
    warranty_offered:  warranty_offered, 
    warranty_duration:  warranty_duration, 
    warranty_type:   warranty_type, 
    shipping_costs_paid_by: shipping_costs_paid_by, 
    refunds:    refunds 
).first_or_create 
1

는 반환하거나 레코드를 생성 한 후 찾았다 경우 첫 번째 체인 연결 범위에 알아 당신은 또한, 을 코드를 줄이기 위해 메타 프로그래밍 방식의 일종을 통해이 작업을 수행 할 수있는 속성 위 대한 scope를 작성, 너무 많은 조건입니다