2011-08-19 7 views
1

다양한 통신 업체의 데이터를 가져 오는 데 Shippinglogic을 사용하고 있습니다.개체를 특성에 저장 하시겠습니까?

내가하고 싶은 일은 내 테이블에 가져온 데이터를 저장하는 것입니다.

그래서 정말 좋아하는 일을하려고 해요 :

여기
ups = Shippinglogic::UPS.new 
self.attributes = ups.track(:tracking_number => number) 
self.save 

이야 무엇 ups.track 호출이 반환 :

>> ups.track(:tracking_number => '1ZX2988X0386964132') 
=> #<Shippinglogic::UPS::Track::Details:0x1093ba7e0 @origin_country="US", @service_type="GROUND", @destination_state="AL", @origin_state="KY", @signature_name=nil, @destination_city="BIRMINGHAM", @events=[#<Shippinglogic::UPS::Track::Details::Event:0x109383010 @country="US", @name="DELIVERED", @postal_code="35242", @city="BIRMINGHAM", @type="D", @state="AL", @occurred_at=Tue Aug 16 13:44:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x109382d90 @country="US", @name="OUT FOR DELIVERY", @postal_code=nil, @city="BIRMINGHAM", @type="I", @state="AL", @occurred_at=Tue Aug 16 07:46:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x1093b1dc0 @country="US", @name="ARRIVAL SCAN", @postal_code=nil, @city="BIRMINGHAM", @type="I", @state="AL", @occurred_at=Tue Aug 16 07:00:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x109382c50 @country="US", @name="DEPARTURE SCAN", @postal_code=nil, @city="NASHVILLE", @type="I", @state="TN", @occurred_at=Tue Aug 16 03:45:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x109382098 @country="US", @name="ARRIVAL SCAN", @postal_code=nil, @city="NASHVILLE", @type="I", @state="TN", @occurred_at=Tue Aug 16 00:19:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x10937d0c0 @country="US", @name="DEPARTURE SCAN", @postal_code=nil, @city="LEXINGTON", @type="I", @state="KY", @occurred_at=Mon Aug 15 21:36:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x109375e38 @country="US", @name="ORIGIN SCAN", @postal_code=nil, @city="LEXINGTON", @type="I", @state="KY", @occurred_at=Mon Aug 15 16:08:00 -0500 2011>, #<Shippinglogic::UPS::Track::Details::Event:0x109370bb8 @country="US", @name="BILLING INFORMATION RECEIVED", @postal_code=nil, @city=nil, @type="M", @state=nil, @occurred_at=Mon Aug 15 12:18:56 -0500 2011>], @origin_city="CAMPBELLSVILLE", @delivery_at=Tue Aug 16 13:44:00 -0500 2011, @status="DELIVERED", @destination_country="US"> 

그러나 attributes에 저장하지 않습니다 Shippinglogic에 의해 반환되는 객체 .

어떻게하면됩니까?

답변

1

방금 ​​Shippinglogic github README를 확인했습니다. 사용법이 아닌 것 같습니다 :

ups = Shippinglogic::UPS.new 
tracking = ups.track(:tracking_number => number) 
self.attributes = tracking.attributes 
save 

README의 유연성 섹션을 확인하면 tracking.attributes 메소드가 사용됩니다.

이 업데이트 : 빠르게 origin_ *, destination_ *, signature_name, 서비스 _, 상태, delivery_at를 얻을, 당신은 같은 것을 할 수 TRACKING_NUMBER해야하는 경우

가 :

ups = Shippinglogic::UPS.new 
tracking = ups.track(:tracking_number => number) 
self.attributes = [:origin_city, ...].inject({}) do |attrs, attr_name| 
    attrs[attr_name] = tracking.try(attr_name) 
    attrs 
end 
save 

을하지만이 그것을하는 빠르고 더러운 방법. 코드의 문자를 많이 저장하면 (아마도) 나는 확신하지 못합니다. 그러나 명시 적으로 하나씩 할당하는 것만 큼 읽기 쉽지 않습니다.

+0

처음에 시도했지만, 위의 예제에서'tracking.attributes'에 의해 반환되는 것은'{: tracking_number => "1ZX2988X0386964132"}' – Shpigford

+0

입니다. 나는 또한 당신의 다른 코멘트를 읽었으며, 당신은 하나씩 속성에 접근하지 않아도되고 싶다고 생각합니다. 적어도 가치가 있는지 확인해 주시겠습니까? 그 질문에 당신의 코드의 요점, 오른쪽 (트랙에 의해 반환 된 개체가 다른 값을 많이 가지고) 같아요? 그러나 당신이 특별히 필요로하는 속성은 무엇입니까? – mikong

+0

그게 이미 Shippinglogic에 있고, 쉽게 사용자 정의 할 수 있습니다 : https://github.com/binarylogic/shippinglogic/blob/master/lib/shippinglogic/ups/track.rb – Shpigford

2

문제는 track 메서드가 개체를 반환한다는 것입니다. 쉽게 저장할 수 없습니다. 그래서 대신, 당신은 당신이 정말로 관심있는 것을 저장하기 위해 그것의 방법을 사용할 필요가 있습니다.

예. #track 개체를 정의하는 방법에 따라 상태 및 서명 이름

ups = Shippinglogic::UPS.new 
track = ups.track(:tracking_number => number) # save the results of the lookup 
     # since the lookup is expensive 
self.status = track.status 
self.signature_name = track.signature_name 
save # no need to say "self.save" 

추가

를 저장, 당신의 데이터 레코드에 전체 개체를 직렬화하는 것이 합리적 일 수 있습니다. 그런 다음 인쇄 할 때 #track 개체를 다시 만드십시오. Article

또 다른 문제는 궁극적으로 아마도 추적 정보를 인간에게 문자열로 표시하려고 할 것입니다. 그렇다면 간단히 strings/html 등으로 일찍 변환하고 결과 문자열을 레코드에 저장하십시오.

+0

self.save의 좋은 점은 코드를 편집 할 때 거의 놓친 것이었다. – mikong

+0

나는 이것을 피하기를 바랬는데, 그 이유는 내가 저장하고자하는 하나의 이동 통신사에 대해 약 12 ​​가지 방법이 있었기 때문이다. (그리고 적어도 나는 이것을 위해 일할 수있는 12 개의 통신 사업자). 모든 메서드는 이미 Shippinglogic에 있으며 데이터베이스 열 이름에 직접 매핑 할 수 있으므로 다시 설정하여 복제하는 것만 큼 기분이 좋습니다. – Shpigford

+0

@Shpigford - "send"메서드와 메타 프로그래밍을 사용하여 코드 줄을 저장할 수 있습니다. 전체 객체 직렬화 및 비 직렬화를 시도해보십시오. 제대로 작동하려면 힘들 수 있습니다. –

관련 문제