Ruby on rails 是否将对象保存到属性?

Ruby on rails 是否将对象保存到属性?,ruby-on-rails,ruby,object,Ruby On Rails,Ruby,Object,我用它从各种载体上提取数据 我要做的是保存拉入表中的数据 所以我试着这样做: ups = Shippinglogic::UPS.new self.attributes = ups.track(:tracking_number => number) self.save 以下是ups.track呼叫返回的内容: >> ups.track(:tracking_number => '1ZX2988X0386964132') => #<Shippinglogic::U

我用它从各种载体上提取数据

我要做的是保存拉入表中的数据

所以我试着这样做:

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">
>ups.track(:tracking_number=>“1ZX2988X0386964132”)
=> #
但是Shippinglogic返回的对象不会保存到
属性中


如何实现这一点?

我刚刚查看了Shippinglogic github自述。这种用法不应该是:

ups = Shippinglogic::UPS.new
tracking = ups.track(:tracking_number => number)
self.attributes = tracking.attributes
save
检查他们自述文件的灵活性部分,您将看到tracking.attributes方法

更新:

如果您需要快速获取来源地、目的地、签名名、服务类型、状态、交货地点和跟踪号,您可以执行以下操作:

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

但这是一种快速而肮脏的方式。我甚至不确定您是否保存了大量代码字符(可能)。但是它的可读性不如一个接一个地显式分配它。

您的问题是
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对象


另一个问题是,据推测,最终您会希望将跟踪信息作为字符串呈现给人类。如果是这样,那么只需尽早将转换为strings/html等,并将结果字符串存储在记录中

关于self.save,我在编辑他的代码时几乎忽略了这一点:)我希望避免这种情况,主要是因为我要存储的单个运营商大约有十几种方法(我将为至少十几家运营商这样做)。所有的方法都已经在Shippinglogic中,并且可以直接映射到数据库列名称,所以我觉得我只是通过再次设置它们来复制东西。@Shpigford--您可以使用“send”方法和元编程来保存代码行。您还可以尝试序列化和反序列化整个对象。这可能很难正常工作。我最初尝试过,但在上面的示例中,
tracking.attributes
返回的唯一内容是
{:tracking_number=>“1ZX2988X0386964132”}
我明白了。我也读过你的其他评论,似乎你不想一个接一个地访问属性。但你至少检查过它们是否有值吗?我想这就是问题代码的重点,对吗(track返回的对象有很多其他值)?但是您具体需要哪些属性呢?这就是Shippinglogic中已经存在的并且可以轻松定制的属性:好的,我可以看到track方法返回Details类的一个实例。所以我猜你想要原产地、目的地、签名、服务类型、状态和交货地点,对吗?让我更新一下我的答案。