2011-08-19 109 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"> 

但由Shippinglogic返回不保存到attributes對象。

我該如何做到這一點?

回答

1

我剛剛檢查了Shippinglogic github自述文件。是不是所謂的用法:

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

檢查他們的自述文件的靈活性部分,你會tracking.attributes方法。

更新:

如果您需要快速獲得origin_ *,destination_ *,signature_name,SERVICE_TYPE,狀態,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方法返回一個對象。您無法輕鬆存儲它。相反,您需要使用其方法來存儲您真正感興趣的內容。

例如,存儲狀態和簽名名

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對象是如何定義的,它可能是合理的整個對象序列化到您的數據記錄。然後在需要打印出來時重新創建#track對象。 Article

另一個問題是,最終,你可能想要將跟蹤信息作爲字符串呈現給人類。如果是這樣,那麼只需儘早轉換爲strings/html等等,並將結果字符串存儲在記錄中。

+0

對self.save的好處,幾乎錯過了,當我編輯他的代碼:) – mikong

+0

我希望避免這種情況,主要是因爲有大約十幾個我想要存儲的單載波的方法(並且至少有我會爲此做十幾個運營商)。所有的方法已經在Shippinglogic中,並可以直接映射到數據庫列的名稱,所以我覺得我只是通過重新設置它們來複制它們。 – Shpigford

+0

@Shpigford - 你可以使用「發送」方法和元編程來保存代碼行。你也可以嘗試序列化和反序列化整個對象。要正確工作可能會非常棘手。 –