Ruby on rails 轨道;在初始值设定项中获取记录

Ruby on rails 轨道;在初始值设定项中获取记录,ruby-on-rails,ruby,Ruby On Rails,Ruby,我一直在想,在初始化器中获取记录是常见的吗 这是服务对象获取记录和生成的pdf接收文件的示例 输入是发票uuid,并获取相关记录,如卡片详细信息、初始值内的发票项目 class Pdf::GenerateReceipt include Service attr_reader :invoice, :items, :card_detail def initialize(invoice_uuid) @invoice ||= find_in

我一直在想,在初始化器中获取记录是常见的吗

这是服务对象获取记录和生成的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
问题是如果没有找到记录,这将生成一个错误。 我可以在初始值设定项中进行拯救,但这似乎并不常见


我怎样才能以更为ruby的方式解决这个问题呢?

这主要是观点和轶事,但我更喜欢尽可能将我的价值观投射到链条的最上层。因此,我会在这个对象之前找到发票,并将其作为参数传入,与card_细节相同

如果您在这个类中这样做,它将限制协调这两个对象的责任,这是一种更容易测试的方法,但也会添加另一层,您必须在将来进行推理

那么我将如何处理,将其分为4部分

发票查询器 卡片查找器 以发票和卡片为参数的Pdf生成器

最后,是协调上述3个动作的方法

希望这有帮助


另外:请阅读avdi grimm的《自信的ruby》一书。它非常适合概述如何处理这种情况。

谢谢!我同意,我已经有了这本书,但还没有读那么多。我明白了为什么要这样做,因为我异步生成并发送了一张收据,所以可能在排队后信用卡就被换了,这可能是个问题。