轨;在初始化程序中获取记录

时间:2017-01-21 12:52:26

标签: ruby-on-rails ruby

我一直想知道在初始化程序中获取记录很常见吗?

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

输入是发票uuid,并获取相关记录,例如卡片详细信息,初始化内的发票项目。

    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 个答案:

答案 0 :(得分:1)

这主要是意见和轶事,但我更倾向于尽可能地将我的价值观投射到链上。所以我会在这个对象之前找到发票并将其作为参数传递,与card_detail相同。

如果你在这个课程中这样做,它将限制协调这两个对象的责任,这更容易测试,但也增加了你将来必须推理的另一个层。

所以我将如何处理,将其分成4个单独的东西

  1. 发票查询工具
  2. Card Finder thing
  3. 将发票和卡作为参数的Pdf Generator

  4. 最后,要编排上述3个动作

  5. 希望这有帮助。

    另外:用avdi grimm查看书中的自信红宝石。概述处理这种情况非常棒。