2017-01-21 94 views
0

我一直在想,在初始化程序中获取记录很常见?导轨;在初始化程序中获取记录

这里这是服务对象获取记录和生成的PDF收据文件的示例。

输入是发票uuid,并获取相关记录,如卡明细,initialier内发票项目。

class Pdf::GenerateReceipt 
     include Service 

     attr_reader :invoice, :items, :card_detail 

     def initialize(invoice_uuid) 
     @invoice ||= find_invoice!(invoice_uuid) # caching 
     @items = invoice.invoice_items 
     @card_detail = card_detail 
     end 
     ..... 

     def call 
     return ReceiptGenerator.new(
      id: invoice.uuid, # required 
      outline: outline, # required 
      line_items: line_items, # required 
      customer_info: customer_info 
     ) 
     rescue => e 
     false, e 
     end 

    ..... 

     def card_detail 
     card_metadata = Account.find(user_detail[:id]).credit_cards.primary.last 

     card_detail = {} 
     card_detail[:number] = card_metadata.blurred_number 
     card_detail[:brand] = card_metadata.brand 
     card_detail 
     end 
    end 

Pdf::GenerateReceipt.('28ed7bb1-4a3f-4180-89a3-51cb3e621491') # => then generate pdf 

问题是如果记录未找到,则会生成错误。 我可以在初始化程序内拯救,但是这似乎并不常见。

我该如何以更多的红宝石方式解决这个问题?

回答

1

这主要是舆论和传闻,但我宁愿与远铸我的价值链向上越好。所以我会在这个对象前面找到发票,并将其作为参数传递,与card_detail一样。

如果你这样做,在这个类中,它会限制责任,协调这两个目标,这是测试的方式更方便,但也增加了,你必须在未来推理另一层。

那么我将如何处理,分成4个独立的东西

  1. 发票查找东西
  2. 卡拾取东西
  3. PDF生成是需要发票和卡作为参数

  4. 最后,东西协调上述

012的3个行动

希望这有助于。

增加:退房由avdi格林书自信红宝石。概述处理这种情况非常棒。

+0

谢谢!我同意,我已经有这本书,但还没有读过那么多。我想出了为什么我这样做,因为我异步生成并发送收据,所以也许信用卡在排队后立即改变,这可能是一个问题。 – Tosh